socket 描述符就緒條件

2021-08-16 12:10:35 字數 1730 閱讀 4230

附註:

我們一直在討論等待某個描述符準備好i/o(讀或寫)或等待其上發生乙個待處理的異常條件(帶外資料)。

對於普通檔案的描述符,讀、寫和異常條件總是返回準備好(apue p407);

而對於套接字就緒狀態的判斷如下:

一、滿足下列四個條件中的任何乙個時,乙個套接字準備好讀。

監聽socket」:該套接字是乙個監聽套接字且已完成的連線數不為0。而這樣的套接字處於可讀狀態,是因為套接字收到了對方的connect請求,執行了三次握手的第一步:對方傳送syn請求過來,使該方監聽套接字處於可讀狀態;通常情況下,對這樣的套接字執行accept操作不會阻塞;

已連線socket」:該套接字的接收緩衝區中的資料位元組大於等於該套接字的接收緩衝區低水位標記的當前大小。對這樣的套接字執行讀操作不會阻塞並返回乙個大於0的值(也就是返回準備好讀入的資料)。可以用so_rcvlowat套接字選項設定該套接字的低水位標記。對於tcp和udp套接字而言,其預設值為1,這意味著,預設情況下,只要緩衝區中有資料,那就是可讀的。

已連線socket」:該連線的讀半部關閉(也就是接收了fin的tcp連線)。對這樣的套接字的讀操作將不阻塞並返回0(也就是返回eof),此時必須且一直會返回0;

已連線socket」:其上有乙個套接字錯誤待處理。對這樣的套接字的讀操作將不會阻塞並返回-1(即返回乙個錯誤),同時把errno設定成確切的錯誤條件。這些待處理錯誤(pending error)也可通過指定so_error套接字選項呼叫getsockopt獲取並清除。

二、下列四個條件中的任何乙個滿足時,乙個套接字準備好寫。

已連線socket/udp socket」:該套接字傳送緩衝區中的可用空間位元組數大於等於該套接字的傳送緩衝區低水位標記的當前大小(對於tcp的已連線socket或者udp socket均可)。對這樣的套接字的寫操作將不阻塞並返回乙個大於0的值(也就是返回準備好寫入的資料)。可以用so_sndlowat套接字選項設定該套接字的低水位標記。對於tcp和udp套接字而言,低水位預設值為2048,傳送緩衝區預設大小為8k,這意味著,預設情況下,乙個套接字連線成功後,總是可寫的;

已連線socket」:該連線的寫半部關閉(主動傳送了fin的tcp連線)。對這樣的套接字的寫操作將產生sigpipe訊號,該訊號的預設行為是終止程序;

已連線socket」:其上有乙個套接字錯誤待處理。對這樣的套接字的寫操作將不會阻塞並且返回-1(即返回乙個錯誤),同時把errno設定成確切的錯誤條件。這些待處理的錯誤也可以通過指定so_error套接字選項呼叫getsockopt函式來取得並清除;

使用非阻塞式connect的套接字已建立連線,或者connect已經以失敗告終,即connect已經完成。

注意

1、套接字接收區快取(用於讀)和傳送區快取(用於寫):

2、接收快取區低水位標記(用於讀)和傳送快取區低水位標記(用於寫):

select系統呼叫 檔案描述符就緒條件

select系統呼叫原型如下 include intselect int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 引數readfds,writefds,exceptfds引數分別指向可讀 ...

檔案描述符就緒的條件(可讀可寫)

下列情況下,socket可讀 1.socket核心接收緩衝區中的位元組數大於或者大於等於其低水位的標記so rcvlowat標記。此時,我們可以無阻塞的該socket,並且讀操作的返回值大於0 2.socket通訊的對方關閉連線,此時對該socket的讀操作將返回0 3.監聽socket上有新的連線...

Socket描述符解釋

因為套接字api最初是作為unix作業系統的一部分而開發的,所以套接字api與系統的其他i o裝置整合在一起。特別是,當應用程式要為網際網路通訊而建立乙個套接字 socket 時,作業系統就返回乙個小整數作為描述符 descriptor 來標識這個套接字。然後,應用程式以該描述符作為傳遞引數,通過呼...