高併發多路I O復用的select介紹

2021-08-18 01:37:17 字數 2453 閱讀 8423

select

1、基本概念

io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合:

(1)當客戶處理多個描述字時(一般是互動式輸入和網路套介面),必須使用i/o復用。

(2)當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。

(3)如果乙個tcp伺服器既要處理監聽套介面,又要處理已連線套介面,一般也要用到i/o復用。

(4)如果乙個伺服器即要處理tcp,又要處理udp,一般要使用i/o復用。

(5)如果乙個伺服器要處理多個服務或多個協議,一般要使用i/o復用。

與多程序和多執行緒技術相比,i/o多路復用技術的最大優勢是系統開銷小,系統不必建立程序/執行緒,也不必維護這些程序/執行緒,從而大大減小了系統的開銷。

2、select函式

該函式准許程序指示核心等待多個事件中的任何乙個傳送,並只在有乙個或多個事件發生或經歷一段指定的時間後才喚醒。函式原型如下:

#include

#include

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)

返回值:就緒描述符的數目,超時返回0,出錯返回-1

函式引數介紹如下:

(1)第乙個引數maxfdp1指定待測試的描述字個數,它的值是待測試的最大描述字加1(因此把該引數命名為maxfdp1),描述字0、1、2...maxfdp1-1均將被測試。

因為檔案描述符是從0開始的。

(2)中間的三個引數readset、writeset和exceptset指定我們要讓核心測試讀、寫和異常條件的描述字。如果對某乙個的條件不感興趣,就可以把它設為空指標。struct fd_set可以理解為乙個集合,這個集合中存放的是檔案描述符,可通過以下四個巨集進行設定:

void fd_zero(fd_set *fdset);           //清空集合

void fd_set(int fd, fd_set *fdset);   //將乙個給定的檔案描述符加入集合之中

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

int fd_isset(int fd, fd_set *fdset);   // 檢查集合中指定的檔案描述符是否可以讀寫 

(3)timeout告知核心等待所指定描述字中的任何乙個就緒可花多少時間。其timeval結構用於指定這段時間的秒數和微秒數。

struct timeval

//建立socket

sockfd = socket(af_inet,sock_stream,0);

if(sockfd == -1)

//ip address

ser_addr.sin_family = af_inet;

ser_addr.sin_port = htons(port);

ser_addr.sin_addr.s_addr = inet_addr(ser_ip);

//bind

if(bind(sockfd,(sockaddr*)&ser_addr,sizeof(ser_addr)) == -1)

//listen

if(listen(sockfd,10) == -1)

//迴圈處理監聽過程

while(true)

//找到最大的檔案描述符

maxfd = (maxfd > fd_conn[i] ? maxfd:fd_conn[i]);

}//呼叫select函式開始監聽socket,select的操作過程是將為就緒的fd從集合中剔除

//在fd_set容器中留下並等待後續的處理fd

int ret = select(maxfd + 1,&sock_set,null,null,null);

if(ret == -1);

int count = 0;

for(int i = 0;i < 10;++i)

sock[count++] = sockfd;

if(connect(sockfd,(sockaddr*)&cli_addr,sizeof(cli_addr)) == -1)    

char buff[1024] = ;

snprintf(buff,sizeof(buff),"nihao server");

int se_len = send(sockfd,buff,sizeof(buff),0);

memset(buff,0,sizeof(buff));

int re_len = recv(sockfd,buff,sizeof(buff) - 1,0);

if(re_len > 0)

}for(int i = 0;i return 0;

}

高併發(多路IO轉接 擴充套件)

寫tcp併發伺服器的時候,併發的實現方式 第一種 阻塞等待 來了乙個客戶端就建立乙個程序或執行緒去伺服器,但是建立的執行緒或程序大多數時間都是處於休眠狀態,所以這種併發的方式比較浪費資源 缺點 浪費資源 記憶體 第二種 非阻塞忙輪詢 accept和read都不帶阻塞,程序在不停的輪詢,如果客戶端沒有...

併發程式設計 網路IO模型 IO多路復用

網路io模型 一 網路io 輸入 recv recvfrom accept 阻塞io 輸出 send sendto sendall connect 會等待一段時間,但是卻是非阻塞io,因為是乙個主動的過程 二 網路io模型 跟socket有關 blocking io 阻塞io 平時用的 tcp ud...

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...