iocp的工作執行緒的個數一般設定為processors *2+2,這是綜合考慮了工作執行緒可能是等待/掛起/正在執行的狀態。如果你測試出更好的結果,以你的為標準。
iocp的工作執行緒由系統排程和優化,不要去干預執行緒的排程,除非你自信能超越系統的排程。
在遇到奇怪的問題時,可以嘗試減少iocp工作執行緒數量,來定位問題所在。
應用層在處理收到的資料時,盡快將資料處理掉或是拷貝乙份,避免阻塞iocp工作執行緒。
在投遞i/o時,如果返回wsa_io_pending,意味著投遞操作成功,但是稍後才會處理完成。一般說來,投遞傳送或接收io請求可能是下面三種結果, 以呼叫wsasend為例:
i.如果操作錯誤碼是error_success,系統將程式緩衝區拷貝到核心緩衝區(也就是tcp/ip棧緩衝區)中,然後在網路適當的時候(比如符合nagle演算法的傳送條件),將資料拷貝到網絡卡緩衝區,進行真正的傳送;
ii.如果操作錯誤碼是wsa_io_pending,意味著此時核心緩衝區空間不夠,系統將鎖定程式緩衝區鎖定到非分頁記憶體中,直到核心緩衝區有足夠的空間來將資料拷貝走;
iii.如果操作結果是其他錯誤碼,根據具體原因,可以選擇釋放socket對應的資源。(該條目參考《windows網路程式設計第2版》)
盡量使i/o緩衝區的大小是系統頁面大小的倍數(32位是4k),這樣避免系統在拷貝程式緩衝區在不足一倍數時而占用整個頁面。
盡量投遞大型i/o操作,也就是每次傳送較大的資料報,而不是多次傳送一些小的資料報,且每次傳送資料都固定大小。
使用acceptex非同步接收的連線,如果要獲取本地/對端的位址,有兩種方式:
i.使用擴充套件api:getacceptexsockaddrs,可以同時獲取本地/對端位址,需要i/o結構的支援;
ii.使用標準api:getsockname/getpeername,由於對端socket尚未與監聽socket完全繫結,需要先設定so_update_accept_context 選項,然後才可以正常獲取到。(適用於winxp以後的版本)
在關閉socket時,注意處理未決的io請求,這些請求以失敗的結果(getqueuedcompletionstatus失敗)返回。
常見錯誤碼:
error_netname_deleted(64):對端關閉socket
error_operation_aborted(995):本端socket被關閉,操作取消
IOCP的一些總結
1 在iocp中投遞wsasend返回wsa io pending的時候,表示非同步投遞已經成功,但是稍後傳送才會完成。這其中涉及到了三個緩衝區。網絡卡緩衝區,tcp ip層緩衝區,程式緩衝區。情況一 呼叫wsasend傳送正確的時候 即立即返回,且沒有錯誤 tcp ip將資料從程式緩衝區中拷貝到t...
IOCP相關的一些總結
1 在iocp中投遞wsasend返回wsa io pending的時候,表示非同步投遞已經成功,但是稍後傳送才會完成。這其中涉及到了三個緩衝區。網絡卡緩衝區,tcp ip層緩衝區,程式緩衝區。情況一 呼叫wsasend傳送正確的時候 即立即返回,且沒有錯誤 tcp ip將資料從程式緩衝區中拷貝到t...
Qt 的一些心得
一.背景刷成黑色,前景色設為白色。方法一 paltette方式,經測試,該方法不會影響到其他控制項,推薦使用 qpalette bgpal palette bgpal.setcolor qpalette background,qcolor 0,0 0,255 qpalette background,...