2013-06-12 11 views
5

Sto usando la funzione ioctlsocket() per rendere il mio socket non bloccante ma quando chiamo recvfrom(), ottengo l'errore 10035 (WSAEWOULDBLOCK).recvfrom() errore 10035 utilizzando socket non bloccanti

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

Qualcuno può spiegare perché questo accade? :(

+0

Le chiamate I/O possono fallire. * Sei sicuro che * riesci * come rendendo il socket non bloccante? – unwind

+1

Ottieni WSAEWOULDBLOCK su un socket non bloccante se al momento non ci sono dati disponibili.Questo è un comportamento normale –

risposta

10

Questo è normale se non sono disponibili dati. Il codice è WSAEWOULDBLOCK (vedi tabella) e mezzi, che su una porta bloccando la funzione avrebbe dovuto sedersi e aspettare fino a che non potrebbe essere servita.

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

Grazie per la risposta, ma io il Cliente sta leggendo continuamente i dati da un file di testo e inviando il socket allora come mai non ci sono dati disponibili da leggere? :( – Ayse

+0

Qualsiasi loop breve come il tuo sarà più veloce dei pacchetti arr iving over the network. Se si ottiene il WSAEWOULDBLOCK, basta mettere il loop in pausa per alcuni millisecondi (ad esempio Sleep (50)) e continuare. – Grezgory

+0

Grazie mille. Funziona ora con Sleep() s ma pensi che sia un buon approccio? Inizialmente utilizzavo WSAWaitforMultipleEvents() per effettuare una chiamata a recvfrom() solo quando è diventato disponibile l'evento FD_READ. Ho pensato che fosse simile a socket non bloccanti ma poi qualcuno mi ha dato l'idea di usare ioctlsocket(). – Ayse

Problemi correlati