G
Wenn die sockets in den non-blocking mode gebracht hast wird accept() quasi sofort nen Socket liefern (oder eben INVALID_SOCKET) - Auf jedenfall keine 5 Sekunden
Wenn du die Sockets die accept() liefert, auch non-blocking machst, verhält sich recv() genauso. Wenn gerade keine Daten da empfangen werden wird recv() SOCKET_ERROR zurückliefern und WSAGetLastError() wird als Begründung WSAEWOULDBLOCK liefern (The socket is marked as nonblocking and the receive operation would block.)
Wenn du also maximal 2 Sekunden lang lesen willst:
DWORD timeEnd;
char buffer[5000];
int bytesReceived;
int bytePos;
timeEnd=GetTickCount()+2000;
bytePos=0;
while (GetTickCount()<=timeEnd) // Solange keine 2000 ms rum sind
{
bytesReceived=recv(einSocket,(buffer+bytePos),50,0); // Maximal 50 Bytes auf einmal einlesen
if (bytesReceived!=SOCKET_ERROR)
{
// Es wurden nen paar Bytes empfangen:
bytePos=bytePos+bytesReceived;
}
else
{
if (WSAGetLastError()!=WSAEWOULDBLOCK))
{
// Es ist irgendein Fehler aufgetreten
// WSAWOULDBLOCK käme wen nur keine Daten zum abholen
// bereit wären, es ist aber nen anderer Fehler aufgetreten
OutputDebugString("Ein böser Fehler ist aufgetreten! \n");
}
}
}
...ist natürlich nur Pseudo-Code - Man müsste z.B. eigentlich noch prüfen ob man nicht über den Speicherbereich vom buffer hinausschreibt
Wenn Du durch die timeouts nur erreichen willst dass deine Programm-Oberfläche nicht einfriert während auf Daten gewartet wird oder Daten eingelesen werden solltest du dir aber besser Threads angucken!