使用事件驱动套接字时如何生成网络事件FD_WRITE?

时间:2013-05-10 09:28:23

标签: c windows winapi events network-programming

我正在研究基于newwork的事件套接字应用程序。

当客户端发送了一些数据并且套接字上有东西需要读取时,会生成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()
            }
        }
      }

1 个答案:

答案 0 :(得分:3)

FD_WRITE表示您现在可以写入套接字。如果发送缓冲区填满(您发送数据的速度比在网络上发送的速度快),最终您将无法再写等待。

由于缓冲区已满而导致写入失败,此消息将发送给您,告知您可以重试该发送。

当你第一次打开套接字时,它也会被发送,让你知道它就在那里,你可以开始写作了。

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

  

FD_WRITE网络事件的处理方式略有不同。一个   首次连接套接字时会记录FD_WRITE网络事件   调用connect,ConnectEx,WSAConnect,WSAConnectByList,   或WSAConnectByName函数或当接受套接字时接受,   AcceptEx,或WSAAccept函数,然后发送失败后   WSAEWOULDBLOCK和缓冲区空间变得可用。因此,一个   应用程序可以假设从第一个开始可以发送   FD_WRITE网络事件设置并持续到发送返回   WSAEWOULDBLOCK。在这样的失败后,应用程序会发现   当FD_WRITE网络事件发生时,再次发送   记录并关联事件对象。

所以,理想情况下,你现在可能会留下一个关于是否可以写的标志。它开始时为true,但最终,在调用sendto时会得到一个WSAEWOULDBLOCK,并将其设置为false。收到FD_WRITE后,将标志设置为true并继续发送数据包。