4

私はnewtworkイベントベースのソケットアプリケーションに取り組んでいます。

クライアントが何らかのデータを送信し、ソケットで読み取るものがある場合、FD_READ ネットワーク イベントが生成されます。

私の理解によれば、サーバーがソケットを上書きしたい場合、FD_WRITEなどのイベントが生成されている必要があります。しかし、このメッセージはどのように生成されるのでしょうか?

読み取り可能なものがあれば、FD_READ が自動的に生成されますが、サーバーが何かを書きたい場合の FD_WRITE はどうでしょうか。

この混乱を手伝ってくれる人はいますか?

以下はコード スニペットです。

WSAEVENT hEvent = WSACreateEvent();
WSANETWORKEVENTS events;
WSAEventSelect(newSocketIdentifier, hEvent, FD_READ | FD_WRITE);

   while(1)
      {   //while(1) starts
         waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, WSA_INFINITE, FALSE);
         //WSAResetEvent(hEvent);
         if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
            {
              //Failure
            }
     else
        {   //else event occurred starts
            if(events.lNetworkEvents & FD_READ)
            {
                            //recvfrom()   
            }
            if(events.lNetworkEvents & FD_WRITE)
            {
                 //sendto()
            }
        }
      }
4

1 に答える 1

4

FD_WRITE は、今すぐソケットに書き込めることを意味します。送信バッファがいっぱいになると (ネットワーク上で送信できるよりも速くデータを送信している)、最終的には少し待つまでそれ以上書き込むことができなくなります。

バッファがいっぱいであるために失敗した書き込みを行うと、このメッセージが送信され、その送信を再試行できることが通知されます。

また、ソケットを最初に開いたときにも送信され、そこにソケットがあり、書き込みを開始できることを知らせます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741576(v=vs.85).aspx

FD_WRITE ネットワーク イベントの処理は少し異なります。connectConnectExWSAConnectWSAConnectByList、またはWSAConnectByName関数の呼び出しでソケットが最初に接続されたとき、またはacceptAcceptEx 、またはWSAAccept関数でソケットが受け入れられ、その後 WSAEWOULDBLOCKで送信が失敗した後、 FD_WRITE ネットワーク イベントが記録されます。バッファスペースが利用可能になります。したがって、アプリケーションは、最初の FD_WRITE ネットワーク イベント設定から送信が可能であり、送信が WSAEWOULDBLOCK を返すまで続くと想定できます。このような失敗の後、アプリケーションは、FD_WRITE ネットワーク イベントが記録され、関連するイベント オブジェクトが設定されたときに、送信が再び可能であることを検出します。

したがって、理想的には、現時点で書き込みを行ってもよいかどうかについてフラグを保持している可能性があります。最初は true ですが、最終的にsendtoを呼び出すとWSAEWOULDBLOCKが返され、それを false に設定します。FD_WRITEを受け取ったら、フラグを true に戻し、パケットの送信を再開します。

于 2013-05-10T09:36:14.553 に答える