網路程式設計之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...