好吧,下面我以粗體文字以下問題問候報價: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.
哦,我現在看到,這完全解釋了它。非常感謝! –