小心使用IOCP完成埠

2021-04-30 16:40:40 字數 878 閱讀 2343

s = createsocket();    //假定s返回值是10

createiocompletionport(s, m_hcompletionport, (dword_ptr)&a, 0);

wsasend(s,...);

wsasend(s,...);

wsasend(s,...);

wsasend(s,...);

wsasend(s,...);

這個時候,完成埠裡累計了多條跟s相關的資料,由於完成埠的執行緒暫時繁忙,未來得及處理s關閉後的失敗資料

closesocket(s);

s = createsocket();    //s的值仍然是10

createiocompletionport(s, m_hcompletionport, (dword_ptr)&b, 0);

好了,本執行緒到此告乙個段落,回到完成埠執行緒上來:

問:pcustomdata是指向a還是指向b?

在我的設計意識裡,pcustomdata應該指向a,且我沒有再任何文件和論壇裡看到提及此問題,且無論是官方的還是非官方的例子都是我這樣的用法。

實際上,pcustomdata指向了b

此時,wsasend(和其他函式)操作的資料和在getqueuedcompletionstatus後處理的資料不再繫結到一致的資料上,bug由此產生,且無法直接觀察,非常難重現,因為closesocket後也不是立即呼叫createsocket,且socket控制代碼被立即復用的概率實在不大,因為不是立即復用,完成埠執行緒就把老控制代碼相關的資料處理完畢了。

這個問題困擾《亂武》專案組和測試組人員至少三周,終在昨日(2008-8.31)獲知原因並得到解決。老謝說值得慶賀,該出去搓一頓。吾深表贊同,不過就是要我買單有些許遺憾——因為**是我寫的。

完成埠iocp和重疊埠

windows下的iocp和 linux下的epoll epoll我還沒有研究過 都是屬於socket 網路程式設計的範疇.不過其特色是 用固定很少的執行緒去管理成千上萬個socket連線.其相當於 非同步通訊 普通socket是同步,同步 可能要乙個執行緒乙個socket鏈結 去做,由於系統可以執...

網路程式設計 完成埠IOCP

分類 網路程式設計 2009 12 31 11 20 755人閱讀收藏 舉報 裝置 windows作業系統上允許通訊的任何東西,比如檔案 目錄 序列口 並行口 郵件槽 命名管道 無名管道 套接字 控制台 邏輯磁碟 物理磁碟等。絕大多數與裝置打交道的函式都是createfile readfile wr...

IOCP 完成埠 開發手記 3

當建立iocp埠後,就要初始化連線監聽,這跟一般的socket是沒有什麼區別的,當然要把它關聯到iocp,否則就不會從iocp那裡得響應.接著就會建立滿足需要的接收請求,這樣就會收到連線進來.如果有連線進來,就會收在getqueued pletionstatus函式裡收到前面發出的請求包,接著就進行...