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 並且提供詳細文件說明...