unix下網路程式設計之I O復用(二)

2021-09-08 16:02:16 字數 3011 閱讀 1164

select函式

該函式允許程序指示核心等待多個事件中的任何乙個發生,並僅在有乙個或是多個事件發生或經歷一段指定的時間後才喚醒它。我們呼叫select告知核心對哪些描述字(就讀、寫或異常條件)感興趣以及等待多長時間。我們感興趣的描述字不侷限於套介面,任何描述字都可以使用select來測試。

select函式原型:

#includeselect.h>

#include

intselect (int maxfd , fd_set *readset ,fd_set *writeset, fd_set *exceptionset , const

struct timeval * timeout);

返回:就緒描述字的正數目,0——超時,-1——出錯

select函式的引數介紹:maxfd表示待測試的描述字個數,其值應該為最大的描述字+1,中間的readset,writeset,exceptionset指定我們要讓核心測試讀、寫、異常條件的描述字,最後乙個引數告知核心等待所指定描述字中的任何乙個就緒可花多長時間。

timeval結構:

struct timeval
timeval引數有三種可能值:1、null:代表永遠等待下去,相當於完全阻塞。2、乙個固定的值,代表等待一段固定的時間。3、timeval的屬性值為0,表示根本不等待,檢查描述字之後立即返回,也就是說事非阻塞的。

fd_set結構:

fd_set結構表示乙個描述字集。它典型的應該以乙個整數陣列來表示,其中每個整數中的每一位對應乙個描述字。關於fd_set有以下四個巨集:

void fd_zero(fd_set *fdset); /*

clear all bits in fdset

*/void fd_set(int fd, fd_set *fdset); /*

turn on the bit for fd in fdset

*/void fd_clr(int fd, fd_set *fdset); /*

turn off the bit for fd in fdset

*/int fd_isset(int fd, fd_set *fdset); /*

is the bit for fd on in fdset ?

*/

select函式修改由指標readset,writeset,exceptionset所指向的描述字集,因而這三個引數都是值-結果引數。也就是說,在select函式執行過程中,會修改其中的值。呼叫該函式時,我們指定關心的描述字的值,該函式返回時,結果指示哪些描述字已就緒。該函式返回後,我們使用fd_isset來測試fd_set資料型別中的描述字。描述字集中任何與未就緒的描述字對應的位返回時均清為0.為此,每次重新呼叫select函式中,我們都得再次把所有描述字集合中的所關心的位置為1。這也是在稍候的通訊例子裡,我們設定resset和allset兩個集合的原因所在。

select函式返回某個套介面就緒的條件:

select函式的通訊例子:乙個簡單的tcp回射伺服器程式

selectserver.c: 使用select機制的伺服器端程式

1 #include 

2 #include

3 #include

4 #include in.h>

5 #include

6 #include select.h>78

const

static

int maxline = 1024;

9const

static

int serv_port = 10001;

1011

int main1()

12 60 }

61/*

找不到,說明client已經滿了

*/62

if(i==fd_setsize)

63

67 fd_set(connfd,&allset);//

設定fd

68/*

更新相關引數

*/69

if(connfd > maxfd) maxfd = connfd;

70if(i>maxi) maxi = i;

71if(nready<=1) continue;

72else nready --;

73 }

7475

for(i=0 ; i<=maxi ; i++)

76

89else

90

95 nready --;

96if(nready<=0) break;

97 }

98 }

99100 }

101return

0;102 }

client.c: 簡單的客戶端程式

1 #include 

2 #include

3 #include

4 #include in.h>

5 #include 67

#define maxline 1024

8int main()

9 30 close(sockfd);

31return

0;32 }

總結:

unix下網路程式設計之I O復用(二)

select函式 該函式允許程序指示核心等待多個事件中的任何乙個發生,並僅在有乙個或是多個事件發生或經歷一段指定的時間後才喚醒它。我們呼叫select告知核心對哪些描述字 就讀 寫或異常條件 感興趣以及等待多長時間。我們感興趣的描述字不侷限於套介面,任何描述字都可以使用select來測試。selec...

unix下網路程式設計之I O復用(五)

本章節是用基本的linux unix基本函式加上select呼叫編寫乙個完整的伺服器和客戶端例子,可在linux ubuntu 和unix freebsd 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,然後輸出到客戶端 客戶端收到服務端的響應,輸出這...

UNIX網路程式設計6 IO復用

i o多路復用是指核心一旦發現程序指定的乙個或者多個i o條件準備就緒,它就通知該程序。i o復用適用於以下場合 當客戶處理多個描述符 一般是互動式輸入或網路套接字 必須適用i o復用 套接字是乙個抽象出來的概念,本質上也是乙個檔案描述符 當乙個客戶處理多個套接字時,這種情況很少見,但也可能出現 當...