[WSOCK]Timeout mit recv
-
Wenn ich recv von Winsock 2 benutze habe ich das Problem, dass erst recv abgeschlossen wird, also fortgefahren wird, wenn Etwas empfangen wird oder der Client die Verbindung zu meinem Proggy beendet.
Wie kann ich einen Timeout für recv erstellen, oder gleich weitergehen, wenn nichts empfangen wurde?
Ich will aber nichts anderes benutzen wie z.B. WSARecv...
Kann mir da jemand helfen??
-
Du musst das Socket in den Nonblocking mode schalten.
Dann recv machen. Wenns nicht geklappt hat (WSAEWOULDBLOCK) ein bisschen warten (am besten mit WaitForSingleObject mit einem Event, das du mit WSAEventSelect eingesetzt hast, und timeout). Wenn WaitForSingleObject timeout zurückliefert, kannst du abbrechen, sonst kannst du recv nochmal probieren.
Und WSAEventSelect, WSARecv & Co. sind doch auch WinAPI, warum willst du die nicht verwenden?
Wenn du WSAEventSelect nicht nehmen willst, musst du eben einfach ein Sleep reinmachen. Das ist aber nicht sehr gut, da IMMER die eingegebene Zeit gewartet wird, auch wenn nach einer zehntel sekunde daten da sind.
-
Wie schalte ich dasSocket in den nonblocking Mode????
-
DWORD iNonBlocking = TRUE; ioctlsocket(m_Socket, FIONBIO, &iNonBlocking);
-
Hi, eine andere, etwas portablere Möglichkeit bietet die Funktion select. Sie wird entsprechend für den Socket aufgerufen der auf Daten warten soll und kann mit einem Timeout versehen werden. Die Funktion beendet wenn Daten da sind und recv ohne blocken die Daten auslesen kann oder mit entspr. Fehlercode wenn die Zeit überschritten wurde.