如果乙個或多個
i/o條件滿足,我們可以被通知到。
場合:1.
當客戶處理多個描述字時
2.乙個客戶同時處理多個套介面
3.乙個
tcp伺服器既要處理監聽套介面,又要處理已連線的套介面
4.乙個伺服器既要處理
tcp,
又要處理
udp
5.乙個伺服器要處理多個服務或者多個協議
i/o模型:l阻塞l
非阻塞l
訊號驅動l非同步
li/o復用
int select( int maxfdp, fd_set *readset, fd_set *writeset, fd_set * exceptset, const struct timeval *timeout);
返回準備好描述字的整數,
0超時,
-1出錯
struct timeval 當
timeout
為空時可能永遠等待下去
當他為0
時,不等待
void fd_zero( fd_set *fdset);
void fd_set(int fd, fd_set *fdset);
void fd_clr(int fd, fd_set * fdset);
intfd_isset(int fd, fd_set *fdset);
int fileno( file *stream);
返回檔案流使用的檔案描述符
接受和傳送低潮限度目的:在
select
返回可讀或可寫條件之前,應用程序可以對多少資料可讀或多大空間可寫進行控制。
批量輸入:當傳送多個請求後,客戶端關閉,但有一些請求在去往伺服器的路上,如果這時關閉則不能讀取到伺服器返回的資料,需要半關閉。即客戶端傳送乙個
fin通知伺服器端我資料傳送完畢,但仍為讀放開套介面描述字。需要函式
shutdown
int shutdown( int sockfd, int howto)0
成功,-1
出錯hwoto
取值:shut_rd
關閉連線的讀這一半,不接受套介面資料,且現留在套介面緩衝區資料作廢
shut_wr
關閉連線寫這一半,半關閉,緩衝區資料都被傳送,。
shut_rdwr
等效於呼叫
shutdown
兩次,呼叫
_rd,和
_wr
int pselect( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
const struct timespec *timeout,
const sygset_t *sigmask)
struct timespec
自己練習了一下:
第6章 I O復用
i o復用使用場合 1 當客戶處理多個描述符時 通常是互動式輸入和網路套接字 2 乙個客戶同時處理多個套接字是可能的。3 如果乙個tcp伺服器既要處理監聽套接字,又要處理已連線套接字。4 當乙個伺服器既要處理tcp,又要處理udp。5 當乙個伺服器要處理多個服務或者多個協議。unix下5種i o模型...
IO復用 select和poll 簡介
b contains b list 1 select 2 poll list b i o復用模型使用在下列網路應用場合 b list 1 當客戶處理多個fd時,必須使用i o復用。2 乙個客戶同事處理多個套接字是可能的。3 如果乙個tcp伺服器處理多個socket。4 如果乙個伺服器處理多個協議。l...
I O復用 select和poll函式 一
我們看到上面的tcp客戶同時處理兩個輸入 標準輸入和tcp套接字。我們遇到的問題就是在客戶阻塞於 標準輸入上的 fgets呼叫期間,伺服器程序會被殺死。伺服器tcp雖然正確地給客戶tcp傳送乙個fin,但是既然客戶程序阻塞於從標準輸入讀入的過程,它將看不到這個rof,知道從套接字讀時為止 可能已經過...