兩中模式執行i/o操作
阻塞模式:執行i/o的winsock呼叫(如send和recv),一直到操作完成才返回。
非阻塞模式:winsock函式會立即返回
1.select(選擇)模型
1>增加乙個套接字集合fd
2>設定乙個可讀或者可寫的套接字集合fd1
3>使用select函式(可設定等待的時長)獲得有i/o操作的套接字集合fd1
4>處理這些i/o
可以理解為:假設有10個快遞要取,我隔斷時間就去快遞站去看有沒有我的快遞,如果有我就拿回來,如果沒有我也立刻回來,重複如此。
2.wsaasyncselect模型(非同步選擇模型)(需要建立乙個視窗用於接收訊息)
以windows訊息的形式接收網路事件通知
可以理解為:我不需要隔段時間就去看快遞有沒有到,如果快遞到了,快遞公司打**給我,我再去拿快遞
3.wsaeventselect模型(事件選擇模型)
接受網路事件,不是依靠windows訊息驅動機制,而是經由事件物件控制代碼通知
1>建立乙個事件控制代碼表和乙個對應的套接字控制代碼表
2>每建立乙個套接字就建立乙個事件物件,把它們的控制代碼分別放入到上面的兩個表中,並呼叫wsaeventselect新增它們的關聯
3>呼叫wsawaitformultipleevents在所有事件物件上等待,以便確認哪些套接字上發生了網路事件
4>處理發生的網路事件,繼續在事件物件上等待
可以理解為:有點類似wsaasyncselect模型,但是它不需要訊息通知,它將套接字和網路事件及事件物件繫結了在一起。就相當於我在快遞站安裝了乙個監測器,如果快遞到了,檢測器就會發出通知,就不用快遞公司乙個乙個的打**。
5.完成埠模型(iocp)
iocp採用了執行緒池(提前建立好執行緒,更有效)+佇列+重疊結構的核心機制完成任務
1>建立完成埠物件
2>建立乙個或者多個工作執行緒(i/o服務執行緒)
3>將套接字關聯到完成埠物件
4>套接字向完成埠提交各種所需請求
5>在完成埠上等待的執行緒池處理這些i/o
#include"cinitsock.h"
cinitsock init;
#define buffer_size 1024
typedef
struct _per_handle_data
per_handle_data,*pper_handle_data;
typedef
struct _per_io_data
per_io_data, *pper_io_data;
dword winapi serverthread(lpvoid lpparam);
int main()
}dword winapi serverthread(lpvoid lpparam)
if (dwtrans == 0 && (pperio->noperationtype == op_read || pperio->noperationtype == op_write))
switch (pperio->noperationtype)
break;
case op_write:
case op_accept:break;}}
return
0;}
套接字i o模型
當套接字建立時,預設情況下是工作在阻塞模式。在阻塞模式下,執行i o的winsock呼叫 如send 和recv 一直到操作完成時才返回。比如呼叫recv 函式,如果對應的緩衝區沒有資料到來。呼叫者將會一直等待下去,直到有資料到達為止。1 阻塞 blocking 模型 對於以下函式呼叫 int ir...
套接字I O模型
在unix下可用的5種i o模型為 柱塞i o模型 非柱塞i o模型 i o復用 select和poll 訊號驅動式i o sigio 非同步i o 柱塞式i o模型 最流行的i o模型是柱塞式i o模型,預設情況下所有套接字都是用柱塞的,以資料報套接字為例子,如圖 程序呼叫recvfrom,其系統...
套接字之重疊I O模型
剛剛把重疊i o套接字理解了一點,於是在此做個筆記,給出乙個重疊i o處理單個套接字的程式。這個程式是tcp的伺服器端程式。該程式只能接收乙個客戶端的連線,迴圈傳送資訊,以及該客戶端退出時伺服器端得到響應。套接字型檔初始化等 省略了,只包含乙個監聽部分和乙個處理i o部分的 如下 開始進行重疊i o...