完成埠 IOCP 怎麼判斷某個連線是否斷開

2021-04-18 15:46:38 字數 708 閱讀 3524

完成埠函式:

bool getqueuedcompletionstatus(

handle completionport,

lpdword lpnumberofbytes,

pulong_ptr lpcompletionkey,

dword dwmilliseconds

);

1.通常做法

目前查了大部分網上的關於完成埠,是否連線斷線,大多是通過*lpnumberofbytes==0來判斷是否有連線斷線的.之前我也是這麼做的.但在實際遊戲平台執行過程中,偶爾有遊戲玩家反映,為什麼我玩著玩著就斷線了,由於網路原因複雜,並沒有對此判斷表示過懷疑.

2.發現問題

今天在除錯網路部分**,,發現有些時候*lpnumberofbytes==0,但是再呼叫ncount = recv函式去收資料,竟然可以收到資料(ncount >0),反覆測試了好幾次,多是如此,那表明dwthancferred==0的時候,並不表示連線已經斷開.

3.解決問題

從上述發現的問題可以看到,*lpnumberofbytes==0時,再用ncount = recv去讀取下資料,如果還是未讀取到資料(ncount==0),那麼就判斷這個連線已經斷開.

完成埠iocp和重疊埠

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

小心使用IOCP完成埠

s createsocket 假定s返回值是10 createiocompletionport s,m hcompletionport,dword ptr a,0 wsasend s,wsasend s,wsasend s,wsasend s,wsasend s,這個時候,完成埠裡累計了多條跟s相關...

網路程式設計 完成埠IOCP

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