webForumDet fria alternativet

Läsa av en port?

C/C++

8 svar · 633 visningar · startad av roj

Medlem sedan apr. 2002179 inlägg
Frågan#1

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.

Medlem sedan juni 20022 599 inlägg
#2

Då får du antingen läsa från socketen i en egen tråd eller använda en asynkron (icke-blockerande) socket.

Medlem sedan apr. 2002179 inlägg
#3

Vet du någonstans jag kan läsa mer om att använda en asynkron socket eller att skapa en egen tråd?

Medlem sedan juni 20022 599 inlägg
#4

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;
}
Medlem sedan dec. 20003 887 inlägg
#5

Ett tips till är att du går till Code Project och söker på threads och sockets.

WSAAsyncSelect är som niko sa struligt, men trevligt ;)

Medlem sedan juni 200010 432 inlägg
#6

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?

Medlem sedan juni 20022 599 inlägg
#7

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.

Medlem sedan apr. 2002179 inlägg
#8

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.

Medlem sedan apr. 2002179 inlägg
#9

Lyckades ville bara säga det :). Använde mej av nikos exempel.. Tack alla för hjälpen.

258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)