IOCP程式設計注意事項

2021-06-28 15:43:18 字數 1389 閱讀 2527

from:

1、每個連線同時最好只有乙個待決的wsarecv。iocp不保證多個待決wsarecv情況下先投遞的wsarecv就一定會先得到完成通知。因此

,多個待決wsarecv可能導致資料亂序,無謂增加**複雜性。

2、投遞0長度緩衝區的wsarecv可以不占用非分頁記憶體,避免wsaenobufs錯誤。

3、每個連線同時最好只有乙個待決的wsasend。傳送資料會鎖定系統費非分頁記憶體,過多的wsasend會導致wsaenobufs錯誤,麻煩的事

情。4、wsasend直接返回成功,說明資料已複製到傳送緩衝區;若wsa_io_pending,則當得到完成通知時,不會出現只傳送部分資料的情

況(本人未具體研究,只是別人看了洩露的nt4.0的**的得到的結論,為了萬全,還是要考慮傳送部分資料的情況,若出現傳送部分資料情

況,那麼乙個連線投遞多個wsasend就不行了,投遞wsasend相當於追加傳送緩衝區,滑動視窗未必會一次性更新)。

5、iocp是為響應大規模併發連線,做到了1、2、3和4能夠盡可能的增加連線併發數量:因為併發數量很大程度是由非分頁記憶體的占用

量決定的。

6、服務端應該提供強制關閉和優雅關閉連線功能。推薦使用強制關閉,以避免socket的time_wait狀態。 

7、多多利用disconnectex函式實現socket 重用,因為socket的分配是有代價的。

8、當socket資源被釋放後,若不存在time_wait狀態,要警惕系統立即把該socket值分配給新的連線,這就導致資源釋放與新舊

socket資源同步問題。建議socket出錯後,先釋放相關資源,再closesocket或者disconnectex。

9、disconnectex不能實現強制關閉:即使設定so_linger選項,disconnectex也不會發出rst,只有fin。

10、當新建乙個連線後,要對新的socket設定so_update_accept_context選項,否則對其的shutdown和disconnectex會有wsaenotconn錯誤,算是個bug。

11、這個和強制關閉有關:取消已經投遞的io操作,可以使用的函式有cancelio和cancelioex,具體區別參見msdn。要注意,cancelioex需要windows server 2008及以上、windows vista及以上。

12、考慮提供接收和傳送緊急資料的介面。

14、呼叫disconnectex()成功後,socket仍然和先前的繫結的完成建一一對應,除非使用closesocket()。

15、當然直接closesocket()也可以取消已投遞的io操作,但是要注意到資源同步的問題、可能發生的socket資源再分配問題。

16、getqueuedcompletionstatu***()是個好函式:一次呼叫盡可能多的獲得完成通知,減少使用者態和核心態之間的切換。

WIN網路程式設計 IOCP服務程式設計注意事項

iocp服務程式設計注意事項 記憶體資源管理 每個重疊的傳送或接收操作所提交的資料緩衝區很可能會鎖定。記憶體被鎖定之後,它不能從物理記憶體換出。但作業系統對 鎖定記憶體的數量 不是投遞的運算元量 有限制,如果伺服器預期處理大量的併發客戶,可以在每個連線上投遞乙個0位元組的接收操作,這樣不會有記憶體鎖...

WIN網路程式設計 IOCP服務程式設計注意事項

iocp服務程式設計注意事項 記憶體資源管理 每個重疊的傳送或接收操作所提交的資料緩衝區很可能會鎖定。記憶體被鎖定之後,它不能從物理記憶體換出。但作業系統對 鎖定記憶體的數量 不是投遞的運算元量 有限制,如果伺服器預期處理大量的併發客戶,可以在每個連線上投遞乙個0位元組的接收操作,這樣不會有記憶體鎖...

程式設計注意事項

1.動態輸出表頭或資料 每次輸出之前,請先清空表頭以及資料再新增。2.一般資料都要分頁,請直接加上分頁 3.重複性資料的校驗 介面接收資料 1.介面接收資料,一般型別接受 例如 string 列印日誌,之後再轉換成自己想要的格式json等。需求評審 問題一 大面問題 1.是什麼?2.怎樣玩?業務流程...