0

私は WSAWaitforMultipleEvents() 関数を使用していますが、ソケットをノンブロッキングにしたと思います。つまり、recvfrom() は、FD_READ イベントが生成され、ソケットでデータを読み取ることができる場合にのみ呼び出されます。したがって、私の recvfrom() は呼び出しでブロックされません。

ソケットをブロックしないようにする私のアプローチは正しいですか? 今でも私のプログラムはイベントを待ってブロックしていると感じているので、実際には非ブロックに見えません。ヘルプのためにコードの一部を追加しています。

前もって感謝します :)

   while(1)
   {
     waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, INFINITE, FALSE);
     if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
     {
      "FAILURE"
      continue;
     }
     else
     {   //else event occurred
        if(events.lNetworkEvents & FD_READ)
        {
           //FD_READ
          if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
          {
             //error in recvfrom
          }
          else
          {
            //recvfrom() succeeded
          }
        }
     }
  }
4

2 に答える 2

2

(recvfrom() はブロックしません):

ioctlsocket(<socket handle>, FIONBIO, <make it non-zero to enable non-blocking>)

于 2013-06-12T05:37:29.323 に答える