2013-06-12 39 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