好的,关于下面的引用,我用粗体文字提出以下问题:
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.
答案 0 :(得分:1)
您如何设计程序来使用此类活动?
为所有传出数据创建缓冲区。
每当您需要发送数据时,请先检查缓冲区。如果缓冲区中有任何未发送的数据,则将所有新数据附加到缓冲区的末尾,以便以后重新发送。否则,尝试尽可能多地通过套接字发送数据,如果报告WSAEWOULDBLOCK
,则停止发送并将剩余的未发送数据部分附加到缓冲区的末尾,以便以后重新发送。 / p>
每当收到FD_WRITE
事件时,请检查缓冲区。如果它不为空,则尽可能多地通过套接字发送缓冲数据,删除成功发送的任何数据部分,如果报告WSAEWOULDBLOCK
,则停止发送并将剩余的未发送数据保留在缓冲区中以后重新发送。