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