網路上常見的一張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...