2013-06-12 16 views
5

Używam funkcji ioctlsocket(), aby moje gniazdo nie blokowało się, ale kiedy wywołuję recvfrom(), pojawia się błąd 10035 (WSAEWOULDBLOCK).recvfrom() błąd 10035 przy użyciu nieblokujących gniazd

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; 
     } 
    } 

Czy ktoś może wyjaśnić, dlaczego tak się dzieje? :(

+0

Wywołania We/Wy mogą się nie udać Czy jesteś pewny, że * odniosłeś sukces *, czyniąc gniazdo niezablokowalnym? – unwind

+1

Otrzymujesz WSAEWOULDBLOCK na niepodlegającym blokowaniu gnieździe, jeśli aktualnie nie ma dostępnych danych To jest normalne zachowanie –

Odpowiedz

10

Jest to normalne, jeśli nie ma dostępnych danych. Kod jest WSAEWOULDBLOCK (zobacz tę tabelę) i oznacza, że ​​na blokowanie portu funkcja musiałaby siedzieć i czekać, aż to mogło być podawane.

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

Dziękuję dla odpowiedzi, ale ja Klient ciągle odczytuje dane z pliku tekstowego i wysyła je przez gniazdo, a jak to możliwe, że nie ma dostępnych danych do odczytania? :( – Ayse

+0

Każda krótka pętla jako Twoja będzie szybsza niż pakiety arr poruszanie się po sieci. Jeśli otrzymasz WSAEWOULDBLOCK, po prostu spuść pętlę na kilka milisekund (np. Uśpij (50)) i kontynuuj. – Grezgory

+0

Wielkie dzięki. Działa teraz z funkcją Sleep(), ale czy uważasz, że to dobre podejście? Początkowo używałem WSAWaitforMultipleEvents(), aby wywołać recvfrom() tylko wtedy, gdy FD_READ Event stał się dostępny. Myślałem, że to jest podobne do nieblokujących gniazd, ale ktoś dał mi pomysł użycia ioctlsocket(). – Ayse

Powiązane problemy