WSAAsyncSelect / Event上的FD_WRITE处理?

时间:2014-02-12 21:17:39

标签: c sockets winapi events networking

好的,关于下面的引用,我用粗体文字提出以下问题:

  

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

因此,在建立/接受连接时生成FD_WRITE,或者在缓冲区再次释放后,send()因WSAWOULDBLOCK而失败。

您如何设计程序来使用此类活动?我的方法将采用以下伪代码 - 我想知道我是否采用了正确的方法:

Call a function
send
if returns WSAWOULDBLOCK
save state of pointers and buffers globally
end function
..
.. //message loop
..
FD_WRITE event!
resume last state of the buffer/send to corresponding socket.
continue sending.

是否有更好的现有模式或......?谢谢。

编辑:想到另一个想法:

Create a queue of "workload"
push data in the queue
if FD_WRITE generated already & sending later - manually signal FD_WRITE to get inside routine
FD_WRITE routine will process sending in queue
if WSAWOULDBLOCK, save queue position & return
..
.. //event loop
..
FD_WRITE event!
continue sending from queue.

1 个答案:

答案 0 :(得分:1)

  

您如何设计程序来使用此类活动?

为所有传出数据创建缓冲区。

每当您需要发送数据时,请先检查缓冲区。如果缓冲区中有任何未发送的数据,则将所有新数据附加到缓冲区的末尾,以便以后重新发送。否则,尝试尽可能多地通过套接字发送数据,如果报告WSAEWOULDBLOCK,则停止发送并将剩余的未发送数据部分附加到缓冲区的末尾,以便以后重新发送。 / p>

每当收到FD_WRITE事件时,请检查缓冲区。如果它不为空,则尽可能多地通过套接字发送缓冲数据,删除成功发送的任何数据部分,如果报告WSAEWOULDBLOCK,则停止发送并将剩余的未发送数据保留在缓冲区中以后重新发送。