1. 程式人生 > 其它 >linux高效能伺服器程式設計---第九章 I/O複用 (1)

linux高效能伺服器程式設計---第九章 I/O複用 (1)

I/O複用使得程式能同時監聽多個檔案描述符.

  • 客戶端程式需要同時處理多個socket 非阻塞connect技術
  • 客戶端程式同時處理使用者輸入和網路連線 聊天室程式
  • TCP伺服器要同時處理監聽socket和連線socket
  • 同時處理TCP和UDP請求 - 回射伺服器
  • 同時監聽多個埠, 或者處理多種服務 - xinetd伺服器

常用手段selectpollepoll

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 連線成功或失敗後