Winsock的IOCP的初步應用與理解

2021-06-16 05:48:46 字數 1749 閱讀 1819

winsock最主要的功能基於socket套接字,現在學得還不是特明白,有個初步的大概認識,通過同步非同步io方式,適用於不同的網路,現在主要提出幾個winsock的關鍵點。

在定義sockaddr_in位址結構時,有個位址家族主要注意下,sin_family這個位址家族可以用兩個巨集來定義,乙個af_inet和pf_inet意思上af_inet為ip協議,pf_inet為tcp協議,一般socket用pf_inet但其實兩個值是一樣的,也可以通用。

利用icop socket通訊建立服務端流程大概為

1、呼叫wsastartup(makeword(2,2),wsadata);初始化,載入winsock的動態鏈結庫,然後是動態鏈結庫的結構資訊wsadata,  imaxsockets為併發的socket的最大數,imaxudpdg收發的資料報的最大長度其他的引數無非就是版本資訊之類的了。

2、這裡我不想去用簡單堵塞似recv和select來進行io操作了,直接用實用性強一點的iocp也就是完成埠的方式進行通訊,而且完成埠的io是用的重疊io,可以理解為非同步的。

3、然後初始化位址結構,sockaddr_in,把socket繫結到這個位址上監聽,期間把完成埠控制代碼初始化一下

handle  completeport=createiocompletionport(invalid_handle_value,null,0,0);

後面會把這個完成控制代碼與socket關聯起來

4、建立服務處理執行緒,把執行緒和完成埠控制代碼關聯起來,即可以接受和傳送了。

createthread(null,0,serverworkerthread,completionport,0,null);

5、然後監聽ip埠

listen(socket,num);num為監聽的執行緒數

6、然後是等接收客戶端的連入的訊息了

socket sockethandle=accpet(socket,(sockaddr*)addr,num);接收這個位址的socket客戶端資訊

7、把socket與完成埠控制代碼關聯起來

在這裡要特殊注意一下,客戶端與伺服器互動時,我們可以互傳乙個單io資料指標和乙個單句柄資料結構(儲存有客戶端socket資訊)進行通訊,所以這裡我們宣告兩個資料結構

typedef struct tagper_handle_data

per_handle_data, *lpper_handle_data;單句柄資料

createiocompletionport((handle)sockethandle,completionport,(dword)lpper_handle_data,null);lpper_handle_data為乙個完成埠虛擬鍵,用來和套接字關聯的單句柄資料資訊結構,用來獲得接受客戶端socket的資訊的結構。

8、設立接收的介面

9、建立的工作者執行緒serverworkthread

迴圈裡while(true)

這裡最好通過執行緒互斥鎖來鎖定執行緒,先createmutex乙個互斥鎖,第二個引數為false為建立的控制代碼為有訊號的,然後用waitforsingleobject()檢查互斥鎖的訊號,然後用releasemutex()釋放佔有權不然其它執行緒中的waitforsingleobject()將阻塞。

返回成功之後取得io資料然後重置io

zeromemory清空per_io_data資料

再賦值per_io_data.databuf.buf=per_io_data.buffer

per_io_data.databuf.len=size

然後再繼續接收wsarecv();

簡單的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的筆記及理解

win下最好的網路模型可能就是iocp完成埠了吧 經過幾天的研究可以使用以下比喻來理解完成埠,完成埠中的完成表示io操作已經完成後才通知程式,完成埠可以更形象的想象成是完成佇列 這裡我將完成佇列想象成乙個管道。網路庫初始化部分省略 第一步 首先主負責人 主線程 在乙個房子 伺服器 裡建立乙個管道 程...

IOCP的封裝和使用

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