好的,关于下面的引文,我有以下粗体问题:
FD_WRITE network事件的处理方式略有不同一个
首次连接套接字时记录FD_WRITE network事件
通过调用connect、ConnectEx、WSAConnect、WSAConnectByList,
或WSAConnectByName函数,或者当接受套接字时,
AcceptEx或WSAAccept函数,然后在发送失败后
WSAEWOULDBLOCK和缓冲区空间变为可用因此,一个
应用程序可以假设可以从第一个开始发送
写入网络事件设置并持续到发送返回
Wsaewuldblock在这样的失败之后,应用程序将发现
当FD_WRITE network事件是
记录并设置关联的事件对象。
因此,当建立/接受连接时,或缓冲区再次释放后,WSAWOULDBLOCK的send()失败时,会生成FD_WRITE。
你将如何设计一个程序来使用这样的事件我的方法是使用下面的伪代码-我想知道我的方法是否正确:
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.
最佳答案
你将如何设计一个程序来使用这样的事件?
为所有传出数据创建缓冲区。
需要发送数据时,请先检查缓冲区如果缓冲区中有任何未发送的数据,请将所有新数据追加到缓冲区的末尾,以便以后重新发送否则,尝试通过套接字发送尽可能多的数据,如果报告WSAEWOULDBLOCK
,则停止发送并将剩余的未发送数据部分附加到缓冲区的末尾,以便稍后重新发送。
每当收到FD_WRITE
事件时,请检查缓冲区如果不为空,则通过套接字发送尽可能多的缓冲数据,删除成功发送的数据的任何部分,如果报告WSAEWOULDBLOCK
,则停止发送,并将剩余的未发送数据保留在缓冲区中,以便稍后重新发送。