Jag vill kunna kolla av tcp/ip stacken på en port och se om det finns något eller om det är tomt.
Mitt program stannar bara och lyssnar och låser sig i det läget tills något kommer på porten.
Jag vill bara snabbt kunna kolla om det finns något på stacken och sen beroende på om det fanns något eller inte gå vidare. hmm (Utan att bygga en loop).
Jag använder mig av wsock32.lib och det är när den utför accept() som den stannar och väntar tills det kommer något på porten och det är det jag vill undvika.
Asynkrona sockets bygger på att man anropar Wsaasyncselect (sök på Google) och säger till Windows att skicka meddelanden till ett visst fönster då det finns data på socketen. Fast det är ganska krångligt att få ihop om man inte har färdig kod eller gjort det förut. Trådningsvarianten är nog lättare.
Ungefär:
DWORD APIENTRY mySocketThread(void *param)
{
//Lägg koden som hanterar socketen här.
//Eftersom detta är en egen tråd kommer WinMain inte att blockeras.
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
DWORD dwTid;
//Starta tråden som hanterar socketen.
CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)mySocketThread, NULL,
0, &dwTid);
//Fortsätt att göra andra saker man normalt gör.
//Skapa fönster osv ..
return 0;
}
niko:
Behöver man inte i det här fallet anropa schemaläggaren och/eller använda semaforer för att låta mySocketThread dela med sig till körtid till main-tråden?
Nej, det båda trådarna kommer i det här fallet (förstaparametern i CreateThread=NULL) att få samma prioritet och slåss om processorn helt demokratiskt. Semaforer (eller annan mekanism) behövs eventuellt om man tänker dela socketen (eller annan kritisk resurs) mellan trådarna. Jag förutsatte det enklast tänkbara scenariot där all hantering av socketen sköts i den nya tråden. Om det sen fungerar vet jag inte eftersom jag inte vet exakt vad roj vill göra eller vad som ska ske då det finns data på socketen.
Vad jag ska göra är ett pluggin som körs när det blir idle tid över i huvud programmet. Under denna idle tid vill jag gå in och kolla ifall något har skickats till mej om inte fortsätta och kolla igen så länge jag är idle. Detta funkar ju inte eftersom när jag börjar lyssna på porten så stannar den i det läget och lyssnar tills jag fått in något på porten vilket hänger mitt program. Jag vill alltså bara gå in läsa av porten och sen fortsätta oavsett om det har skickats något eller ej.