2013-06-12 5 views
5

Ich verwende ioctlsocket() -Funktion, um meinen Socket nicht blockierend, aber wenn ich recvfrom() aufrufen, bekomme ich den Fehler 10035 (WSAEWOULDBLOCK).recvfrom() Fehler 10035 mit nicht blockierenden Sockets

u_long mode = 1; 
ioctlsocket(newSocketIdentifier, FIONBIO, &mode); 

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     char err[128]; 
     itoa(WSAGetLastError(),err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     BREAK; 
     } 
    } 

Kann jemand erklären, warum das passiert? :(

+0

E/A-Aufrufe können fehlschlagen. Sind Sie sicher, dass * der Socket nicht blockiert? – unwind

+1

Sie erhalten WSAEWOULDBLOCK auf einem nicht blockierenden Socket, wenn derzeit keine Daten verfügbar sind. Das ist normales Verhalten. –

Antwort

10

Das ist normal, wenn keine Daten verfügbar sind. Der Code WSAEWOULDBLOCK ist (siehe diese Tabelle) und bedeutet, dass auf einem Sperr Port die Funktion sitzen müßte, und warten, bis sie bedient werden kann.

while(1) 
    { 
     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
     { 
     int ierr= WSAGetLastError(); 
     if (ierr==WSAEWOULDBLOCK) { // currently no data available 
      Sleep(50); // wait and try again 
      continue; 
     } 

     // Other errors 
     char err[128]; 
     itoa(ierr,err,10); 
     MessageBox(NULL,"Could not Receive Data",err,MB_ICONINFORMATION); 
     break; 
     } 
    } 
+0

Vielen Dank für die Antwort, aber ich den Client liest kontinuierlich Daten aus einer Textdatei und Senden über den Socket dann, wie kommt es, gibt es keine Daten zum Lesen? :( – Ayse

+0

Jede kurze Schleife als Ihre wird schneller sein als Pakete arr über das Netzwerk. Wenn Sie den WSAEWOULDBLOCK erhalten, setzen Sie Ihre Schleife für einige Millisekunden (z. B. Schlaf (50)) in den Ruhezustand und fahren Sie fort. – Grezgory

+0

Vielen Dank. Es funktioniert jetzt mit Sleep() s aber denken Sie, es ist ein guter Ansatz? Anfangs verwendete ich WSAWaitforMultipleEvents(), um einen Aufruf von recvfrom() nur dann auszuführen, wenn FD_READ Event verfügbar wurde. Ich dachte, es wäre ähnlich wie nicht blockierende Sockets, aber dann gab mir jemand die Idee, ioctlsocket() zu verwenden. – Ayse

Verwandte Themen