我正在研究基于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()
}
}
}
答案 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并继续发送数据包。