windows網路程式設計之Select模型基礎知識

2021-08-02 12:17:13 字數 1556 閱讀 8444

網路程式設計之select模型

一. 設計思想:

利用select函式,判斷套接字上是否存在資料,或者能否向乙個套接字寫入資料。目的是防止應用程式在套接字處於鎖定模式時,呼叫recv(或send)從沒有資料的套接字上接收資料,被迫進入阻塞狀態。

二. select函式:

2.1 select函式

int

select (

int nfds, //忽略,僅為了與berkeley套接字相容

fd_set far * readfds, //指向乙個套接字集合,用來檢測其可讀性

fd_set far * writefds, //指向乙個套接字集合,用來檢測器可寫性

fd_set far * exceptfds, //指向乙個套接字集合,用來檢測錯誤

const

struct timeval far * timeout //等待函式最長時間,null為無限大

);//返回值,函式呼叫成功,返回網路事件的所有套接字數量的總和,

// 超時返回0

// 失敗返回socket_error

2.2 套接字集合:

fd_set結構可以把多個套接字連線到一起,形成套接字集合,select函式可以測試這個集合中那些套接字發生了網路事件。

typedef struct fd_setfd_set;

fd_zero(*set)

//初始化set為空集合。集合使用前應該初始化為空

fd_clr(s, *set)

//從set中移除套接字s

fd_isset(s, *set)

//判斷s是否是set的成員,返回乙個bool值

fd_set(s, *set)

//將套接字s新增到集合set中

2.3 網路事件

傳遞給select函式的3個fd_set結構中,

readfds: 為了檢查其可讀性對應的網路事件:

1. 資料可讀(接收到資料)

2. 連線已經關閉,重啟或者中斷

3. 監聽套接字接收到客戶端連線,accept將成功

writefds:為了檢查可寫性,對應的網路事件:

1. 資料能夠傳送

2. 如果乙個非阻塞套接字連線呼叫正在處理,連線已成功(客戶端呼叫connect函式)

exceptfds:檢查錯誤,對應的網路事件:

1. 連線失敗

2. oob資料可讀

注意: select中任何兩個集合都可以為空,非空的集合至少含有乙個套接字。

使用說明:

當select函式返回時,他通過移除沒有未決i/o操作的套接字控制代碼,改變每個fd_set集合

例如:想要測試套接字s是否可讀的步驟:

1. 將s新增到readfds集合,呼叫select函式,等待返回。

2. 返回,確定s是否還在select函式中,

在:呼叫recv或者accept函式接收資訊

否則:返回

windows網路程式設計之select模型 改進

最近重溫一下windows的網路模型 windows網路與通訊程式設計 發現大多數的select模型都會做乙個遍歷,然後處理對應的資料。裡面提到了一點 2 將fdsocket 集合的拷貝fdread 傳遞給select 函式,當有事件發生時,select 函式移除fdread 集合中沒有未決i o ...

Windows網路程式設計之send 函式

一 作用 向目標傳送資料,本質上就是將資料複製貼上進系統的協議傳送緩衝區,計算機伺機傳送出去 二 句法int wsaapi send socket s,const char buf,int len,int flags s 標識已連線套接字的描述符。buf 指向包含要傳輸的資料的緩衝區的指標。len ...

網路程式設計 之 網路基礎

網路程式設計 1.乙個程式如何在網路上找到另乙個程式?首先,程式必須要啟動,其次,必須有這台機器位址,我們都知道我們人的位址大概就是國家 省 市 區 街道 樓 門牌號這樣子。那麼每一台聯網的機器在網路上也有自己的位址,他們位址是怎麼表示的呢?就是使用一串數字來表示的,例如 100.4.5.6什麼是i...