第6章 I O復用 select和poll函式

2021-05-08 09:18:59 字數 1440 閱讀 1098

如果乙個或多個

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,知道從套接字讀時為止 可能已經過...