Windows套接字I O模型

2021-08-04 06:04:18 字數 1723 閱讀 7518

兩中模式執行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...