linux高效能伺服器程式設計---第九章 I/O複用 (1)
阿新 • • 發佈:2022-05-06
I/O複用使得程式能同時監聽多個檔案描述符.
- 客戶端程式需要同時處理多個socket 非阻塞connect技術
- 客戶端程式同時處理使用者輸入和網路連線 聊天室程式
- TCP伺服器要同時處理監聽socket和連線socket
- 同時處理TCP和UDP請求 - 回射伺服器
- 同時監聽多個埠, 或者處理多種服務 - xinetd伺服器
常用手段select
, poll
, epoll
select
#include <sys/select.h> // nfds - 被監聽的檔案描述符總數 // 後面三個分別指向 可讀, 可寫, 異常等事件對應的檔案描述符集合 // timeval select超時時間 如果傳遞0 則為非阻塞, 設定為NULL則為阻塞// 成功返回就緒(可讀, 可寫, 異常)檔案描述符的總數, 沒有則返回0 失敗返回-1 int select (int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout); //操作fd_set的巨集 FD_ZERO(fd_set* fdset); FD_SET(int fd, fd_set* fdset); FD_CLR(int fd, fd_set* fdset); FD_ISSET(int fd, fd_set* fdset); // 設定 timeval 超時時間 struct timeval {long tv_sec; // 秒 long tv_usec; // 微秒 }
select
檔案描述符就緒條件
- socket核心接收快取區中的位元組數大於或等於 其低水位標記
- socket通訊的對方關閉連線, 對socket的讀操作返回0
- 監聽socket上有新的連線請求
- socket上有未處理的錯誤, 可以使用getsockopt來讀取和清除錯誤
- socket核心的傳送緩衝區的可用位元組數大於或等於 其低水位標記
- socket的寫操作被關閉, 對被關閉的socket執行寫操作將會觸發一個SIGPIPE訊號
- socket使用非阻塞connect 連線成功或失敗後