2014-02-12 19 views
2

好吧,下面我以粗體文字以下問題問候報價:WS_AsyncSelect/Event上的FD_WRITE處理?

的FD_WRITE網絡事件略有不同的處理。 FD_WRITE網絡事件是在套接字首次連接 時調用connect,ConnectEx,WSAConnect,WSAConnectByList, 或WSAConnectByName函數,或者當接受套接字時, AcceptEx或WSAAccept函數,然後在發送失敗, WSAEWOULDBLOCK和緩衝區空間變爲可用。因此,一個 應用程序可以假定可以從第一個網絡事件設置爲 開始發送並持續到一個發送返回 WSAEWOULDBLOCK。在發生這種故障後,應用程序將找出 ,當FD_WRITE網絡事件記錄爲 且設置了關聯的事件對象時,該應用程序將再次發送。

因此,當連接建立/接受或send()在WSAWOULDBLOCK失敗後,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. 

回答

1

你會如何設計一個方案,以使用這樣的事件?

爲所有外發數據創建一個緩衝區。

無論何時您需要發送數據,請首先檢查緩衝區。如果緩衝區中有任何未發送的數據,則將所有新數據附加到緩衝區的末尾以便稍後重新發送。否則,嘗試通過套接字發送儘可能多的數據,並且如果報告了WSAEWOULDBLOCK,則停止發送並將剩餘未發送的數據部分追加到緩衝區的末尾以便稍後重新發送。

每當您收到FD_WRITE事件時,請檢查緩衝區。如果不是空的,儘可能多地通過套接字發送緩衝數據,刪除成功發送的任何數據部分,並且如果報告WSAEWOULDBLOCK,則停止發送,並將剩餘未發送的數據留在緩衝區中以供稍後重新發送,發送。

+0

哦,我現在看到,這完全解釋了它。非常感謝! –