第六章 I O復用2 select和poll函式

2021-08-26 10:17:05 字數 2352 閱讀 2491

select函式

intselect(int maxfd1, fd_set *readset, fd_set* writeset, fd_set *exceptset, conststruct timeval * timeout)

如果對某個條件不感興趣的話,就直接置null就好了,如果三個套接字集都設定為null就生成了比sleep還要精確的休眠函式(精確到微秒)

maxfdp1是套接字的個數,也是最大fd+1,因為是fd是從0開始計數的

select函式返回跨所有描述子集的已準備好的位數,如果是timeout時間到了的話,就直接返回0,如果函式返回-1就說明出現了錯誤,一般都是因為被訊號中斷了的,呼叫perror函式來檢視當前errno所代表的錯誤描述

套接字準備好的條件(即select函式返回)

讀描述符集:1 是當核心中的套接字緩衝區的資料大於等於套接字接受緩衝區的低潮限度的時候(設定低潮限度是為了是應用層決定多少資料才能完成一項任務的,比如說低潮限度設定為5位元組,應用層就是說,當該套接字核心緩衝區的資料至少是5個位元組的時候,我才要接受,才能完成我應用層的某項業務)

2 就是讀連線關閉,另一端傳送了close或者shutdown操作所產成的fin資料報

3 就是伺服器傳送rst資料報的時候,說我伺服器沒有該項服務,請重新建立連線

4 就是套接字發生錯誤的時候

寫套接字集:1 當寫到核心緩衝區的資料大於等於該套接字的低潮限度的時候

2 就是套接字傳送了fin資料報的時候,連線的寫著一半關閉的時候在發傳送資料的時候核心會給應用層sigpipe訊號結束該程序

3 就是寫套接字發生錯誤的時候

intshutdown(int sockfd ,int howto)

shut_rd 關閉套接字的讀方向的連線,這個時候不再接受套介面中的資料並且留在套介面緩衝區的資料都將作廢

shut_wr 關閉套接字傳送的連線,當前留在套介面傳送緩衝區的資料都被傳送後,後跟正常的連線終止序列

shut_rdwr等效上面兩個的綜合體

int pselect(int maxfd, fd_set *rd, fd_set *wr, fd_set*err, const struct timespec *timeout,const sygset_t *sigmask)

structtimespec

time_t tv_sec;

long tv_nsec;//na miao

poll 和select函式一樣這裡就不詳細講解了

現在把客戶端改寫成select進行驅動的了:

#include #include #include #include #include #include #include #include #include #include #include #define ser_ip "127.0.0.1"

#define ser_port 9877

#define max_line 128

int max(int a, int b)

else }

void send_myself(int fd)

; int size;

fd_set set;

fd_zero(&set);

fd_set(fileno(stdin), &set);

fd_set(fd,&set);

int max1 = max(fileno(stdin), fd)+1;

select(max1, &set, null, null, null);

if(fd_isset(fileno(stdin), &set))

write(fd, tmp, strlen(tmp));

} if(fd_isset(fd, &set))

fputs(tmp,stdout);

} //fgets(tmp,max_line - 1,stdin);

//write(fd,tmp, strlen(tmp)); }

int main(int argc, char** argv)

bzero(&s_addr, sizeof(s_addr));

s_addr.sin_family = af_inet;

//s_addr.sin_addr.s_addr = htonl(

inet_pton(af_inet,ser_ip,&s_addr.sin_addr);

s_addr.sin_port = htons(ser_port);

if(connect(send_sk,(struct sockaddr*)&s_addr,len) == -1)

while(1)

}

週六日雙休,爽

《第六章 復用類》 總結

關於涉及繼承的匯出類的初始化順序 1.先載入基類 如果有基類的基類,則先載基類的基類 從外往內 2.靜態變數初始化 先基類再匯出類 從外往內 3.各個基類和匯出類靜態初始化完後,執行匯出類的main方法 main中語句順序執行 4.如果在main中有顯式建立匯出類的物件,則將在匯出類構造器呼叫之前先...

UNP學習第六章select

乙個輸入操作一般有兩個不同的階段 1.等待資料準備好 2.從核心到程序拷貝資料 五個i o模型基本區別 此系統呼叫直到資料報到達切拷貝到應用緩衝區或是出錯才返回。前三次呼叫recvfrom任無資料返回,因此核心立即返回乙個ewouldblock錯誤。第四次呼叫recvfrom時,資料已準備好,被拷貝...

第六章 高階I O函式

1 write 函式定義 ssize t write int fd,const void buf,size t count 函式說明 write 會把引數buf所指的記憶體寫入count個位元組到引數放到所指的檔案內。返回值 如果順利write 會返回實際寫入的位元組數。當有錯誤發生時則返回 1,錯...