網路程式設計 select介紹

2022-09-16 03:00:16 字數 1653 閱讀 6093

一、select函式簡介

select一般用在socket網路程式設計中,在網路程式設計的過程中,經常會遇到許多阻塞的函式,網路程式設計時使用的recv, recvfrom、connect函式都是阻塞的函式,當函式不能成功執行的時候,程式就會一直阻塞在這裡,無法執行下面的**。這是就需要用到非阻塞的程式設計方式,使用 selcet函式就可以實現非阻塞程式設計。

selcet函式是乙個輪循函式,即當迴圈詢問檔案節點,可設定超時時間,超時時間到了就跳過**繼續往下執行

select(),確定乙個或多個套介面的狀態,本函式用於確定乙個或多個套介面的狀態,對每乙個套介面,呼叫者可查詢它的可讀性、可寫性及錯誤狀態資訊,用fd_set結構來表示一組等待檢查的套介面,在呼叫返回時,這個結構存有滿足一定條件的套介面組的子集,並且select()返回滿足條件的套介面的數目。

通常採用select實現多路復用,也就是說可以同時監聽多個檔案描述符;

下面是select的函式原型:

/* according to posix.1-2001 */

2 #include 3

4 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

下面進行具體的解釋:

第乙個引數:int nfds--->是乙個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1

第二個引數:fd_set *readfds---->用來檢查一組可讀性的檔案描述符。

第三個引數:fd_set *writefds---->用來檢查一組可寫性的檔案描述符。

第四個引數:fd_set *exceptfds---->用來檢查檔案檔案描述符是否異常

第五個引數:sreuct timeval *timeout--->是乙個時間結構體,用來設定超時時間

timeout:最多等待時間,對阻塞操作則為null

select函式的返回值 

負值:select錯誤

正值:表示某些檔案可讀或可寫

0:等待超時,沒有可讀寫或錯誤的檔案

下面是一些跟select一起使用的函式及結構的作用

void fd_clr(int fd, fd_set *set);//清空乙個檔案描述符的集合

int fd_isset(int fd, fd_set *set);//將乙個檔案描述符新增到乙個指定的檔案描述符集合中

void fd_set(int fd, fd_set *set);//將乙個給定的檔案描述符從集合中刪除;

void fd_zero(fd_set *set);//檢查集合中指定的檔案描述符是否可以讀寫

struct timeval結構是用來設定超時時間的,該結構體可以精確到秒跟毫秒

struct timeval 

;

下面是select常用的乙個例子:

#include #include #include #include #include int main(int argc, cahr **ar**)

else if(ret == 0)

if(fd_isset(pesockfd, &rfds))

return 0;

}

網路程式設計 select模型

select 機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fe set的內容,由此...

linux 網路程式設計 select

include include include include include include include include include include include include typedef struct st fd def 將fd接收套接字描述符放入到fd陣列中 int add f...

關於網路程式設計select小結

描述符讀就緒情況 1 套接字的讀緩衝大於低位標記so recvnowat 預設為1 2 監聽套接字監聽到新的連線 3 套接字接收到了fin訊號,read 0.4 套接字出錯,read 1 描述符寫就緒情況 1 套接字的寫緩衝大於低位標記so sendnowat 預設為2048 2 套接字接收到了fi...