recvfrom()错误10035使用非阻塞套接字

Ays*_*yse 8 c sockets error-handling networking visual-studio-2008

我正在使用ioctlsocket()函数使我的套接字无阻塞但是当我调用recvfrom()时,我得到错误10035(WSAEWOULDBLOCK).

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;
      }
   }
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样吗?:(

Gre*_*ory 12

如果没有可用数据,这是正常的.代码是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;
      }
   }
Run Code Online (Sandbox Code Playgroud)

  • 睡眠是一种笨拙的解决方案.通常使用select()(或者可能是WSAWaitforMultipleEvents())来等待可用数据,然后尝试读取.或者只是使用一个阻塞套接字,它会以最好的方式为您做等待. (4认同)