2013-06-12 40 views
5

我使用ioctlsocket()函數,使我的插座非阻塞的,但是當我打電話recvfrom的(),我得到的錯誤10035(WSAEWOULDBLOCK)。recvfrom的()錯誤10035使用非阻塞套接字

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

任何人都可以解釋爲什麼發生這種情況? :(

+0

I/O調用可能會失敗您確定*成功*因爲使套接字非阻塞? – unwind

+1

如果當前沒有可用的數據,您將WSAEWOULDBLOCK放在非阻塞套接字上,這是正常行爲 –

回答

10

這是正常的,如果沒有數據可用,該代碼是WSAEWOULDBLOCK(見表格)和手段,即阻塞端口的功能將不得不坐下來等待,直到它可以提供服務。

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

謝謝對於響應,但是我的客戶端不斷從文本文件中讀取數據並通過套接字發送,那麼怎麼沒有數據可供讀取?:( – Ayse

+0

作爲您的任何短循環將快於數據包arr通過網絡。如果您獲得WSAEWOULDBLOCK,只需讓您的循環睡眠幾毫秒(例如Sleep(50))並繼續。 – Grezgory

+0

非常感謝。它現在和Sleep()一起工作,但你認爲它是一個好方法嗎?起初我是用WSAWaitforMultipleEvents()以給recvfrom()的調用,只有當FD_READ事件變得可用。我認爲這是類似於非阻塞套接字,但後來有人給我)使用ioctlsocket的想法(。 – Ayse