linux網路程式設計學習筆記 select程式設計

2021-10-04 05:08:14 字數 1792 閱讀 4076

網路上常見的一張tcp狀態轉換圖,實線是主動端,虛線是被動端

關於select用法

#include /* according to earlier standards */

#include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

nfds: 監控的檔案描述符集裡最大檔案描述符加1,因為此引數會告訴核心檢測前多少個檔案描述符的狀態

readfds: 監控有讀資料到達檔案描述符集合,傳入傳出引數

writefds: 監控寫資料到達檔案描述符集合,傳入傳出引數

exceptfds: 監控異常發生達檔案描述符集合,如帶外資料到達異常,傳入傳出引數

timeout: 定時阻塞監控時間,3種情況

1.null,永遠等下去

2.設定timeval,等待固定時間

3.設定timeval裡時間均為0,檢查描述字後立即返回,輪詢

struct timeval ;

void fd_clr(int fd, fd_set *set); //把檔案描述符集合裡fd清0

int fd_isset(int fd, fd_set *set); //測試檔案描述符集合裡fd是否置1

void fd_set(int fd, fd_set *set); //把檔案描述符集合裡fd位置1

void fd_zero(fd_set *set); //把檔案描述符集合裡所有位清0

學習了select,最大的有點就是跨平台linux,windows,mac都支援,自己架構的好的話,並不比poll和epoll效率低,缺點是需要自己來寫邏輯**提高效率。記錄下原始碼邏輯,為了以後複習。

#include #include #include #include #include #include #include "wrap.h"

#define serv_port 6666

int main(int argc, char *ar**)

if (i == fd_setsize)

fd_set(connfd, &allset); /* 向監控檔案描述符集合allset新增新的檔案描述符connfd */

if (connfd > maxfd)

maxfd = connfd; /* select第乙個引數需要 */

if (i > maxi)

maxi = i; /* 保證maxi存的總是client最後乙個元素下標 */

if (--nready == 0)

continue;

} for (i = 0; i <= maxi; i++) else if (n > 0)

if (--nready == 0)

break; /* 跳出for, 但還在while中 */}}

}close(listenfd);

return 0;

}

Linux網路程式設計學習筆記(五)

通過捕捉sigchld訊號捕捉殭屍程序,可解決多個子程序同時連線的情況 伺服器端 include include include include include include include include include void error handling char message void...

Linux網路程式設計學習筆記 索引

一 linux基本知識 學習筆記 linux平台的檔案i o操作 學習筆記 linux平台的檔案,目錄及操作 linux學習筆記 標準輸入輸出 linux學習筆記 程序概念及控制 linux學習筆記 訊號處理 二 程序間通訊 三 傳輸層協議tcp和udp 四 tcp套接字 五 udp資料報 六 套接...

linux網路程式設計筆記

以下是對我之前學習的linux網路程式設計的一些筆記。int socket int domain,int type,int protocol type這個引數,可以加上乙個 sock nonblock,把套接字設定為非阻塞,保證這一設定的原子性。int listen int sockfd,int b...