用IOCP和ACCEPTEX,構建CP和執行緒池后,客戶端向服務端發送資料,服務端向每一個連接的客戶端發送資料沒問題,但在客戶端用closesocket()關閉與服務端的連接后,服務端用getqueuedcompletionstatus檢查,根據取得資料為0,在服務端就用closesocket()斷開與客戶端的連接,這時出問題了。好像getqueuedcompletionstatus取得了多次的0,基本在3-8次。哪位大神給分析分析O(∩_∩)O哈!
uj5u.com熱心網友回復:

多執行緒工程,設定了/MT /MD了嗎? 別是/ML 了
uj5u.com熱心網友回復:
如果某個socket出現例外,那么這個socket上相關的投遞都會回傳這個時候就需要注意,
已經關閉的socket,就不能再次呼叫closesocket
uj5u.com熱心網友回復:
已解決了,謝謝各位!我在接到CP的IO事件后,向各客戶端發送資訊,采用了WSASend(),現在改成Send(),就沒有問題了。
uj5u.com熱心網友回復:
還是同步的問題,考慮的地方挺多。就像2樓說的,關閉socket不能重復關閉
可以在關閉前檢查socket是否是INVALID_SOCKET,關閉了socket就要設定socket為INCALID_SOCKET
在closesocket前要考慮其他情況,比如有未完成的io請求(closesocket會取消未完成的請求),還有其他執行緒正在處理同一個socket的請求,這時候關閉就崩潰(不是關閉socket引起崩潰,而是類似delete重疊結構的動作引起的),必須用同步等socket處理完成才能關閉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/82902.html
標籤:網絡編程
上一篇:在服務中用CreateProcessAsUser運行的外部EXE不能創建快捷方式
下一篇:服務啟動無法創建快捷方式
