IOCP的筆記及理解

2021-06-16 09:23:31 字數 1142 閱讀 5843

win下最好的網路模型可能就是iocp完成埠了吧

經過幾天的研究可以使用以下比喻來理解完成埠,

完成埠中的完成表示io操作已經完成後才通知程式,完成埠可以更形象的想象成是完成佇列

這裡我將完成佇列想象成乙個管道。

網路庫初始化部分省略

第一步:首先主負責人(主線程)在乙個房子(伺服器)裡建立乙個管道

程式實現

handle hiocp = createiocompletionport(invalid_handle_value,0,0,0);

第二步:然後再安排n個工人(工作執行緒)去管道的末端讓他們去等待管道了有資料流出,然後再處理這些資料(工作執行緒函式)

程式實現

system_info si;

getsysteminfo(&si);

dword dwthreadcnt = si.dwnumberofprocessors * 2;

for(dword i = 0; i < dwthreadcnt; i++)

dword dwbytetrans = 0;

postqueuedcompletionstatus(hiocp,dwbytetrans,0,0);

closesocket(sserver);

return 0;

第五部:工人的工作流程(工作執行緒)

工人們輪流等待管道中有資料流出(等待iocp佇列有完成操作),當有資料從管道中流出時,工人們通過流出的乙個箱子和乙個關鍵值來獲取這次資料的資訊

從關鍵值(per_handle_data)中就可以獲取資訊是來自哪乙個連線,從資訊箱子中可以獲取到此次資料是哪一種io操作,即它的一些資料資訊,

處理完這些資訊之後,又告訴這個連線說他們在管道末端已經開始準備你的下一次io操作了

**實現

dword winapi workerthread(lpvoid lpparameter)

else

//處理相關資料

cout<<"接受來自"szbuf;

piodata->wsabuf.len = max_buff_size;

} return 0;

}

Winsock的IOCP的初步應用與理解

winsock最主要的功能基於socket套接字,現在學得還不是特明白,有個初步的大概認識,通過同步非同步io方式,適用於不同的網路,現在主要提出幾個winsock的關鍵點。在定義sockaddr in位址結構時,有個位址家族主要注意下,sin family這個位址家族可以用兩個巨集來定義,乙個af...

簡單的iocp例子

include include include include include using namespace std define i port 1666 define i addr 0.0.0.0 define dft buffer size 4096 define opt read 0 def...

IOCP的封裝和使用

現在基於iocp input output completion port 的文章其實已經很多了,但是那些文章都不太容易理解,主要是因為iocp本身的一些不易理解的東西,並且沒有相關的能夠說明該技術和 示例的標準文件。因此我決定做乙個簡單的高併發iocp的例子 oiocpnet 並且提供詳細文件說明...