9

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

なぜこれが起こるのか誰か説明できますか?:(

4

2 に答える 2

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;
      }
   }
于 2013-06-12T11:24:21.137 に答える