天天看點

socket 可讀 可寫 條件

一、 下列四個條件中的任何一個滿足時,socket準備好讀:

 1.socket接收緩沖區中已經接收的資料的位元組數大于等于socket接收緩沖區低潮限度的目前值;對這樣的socket的讀操作不會阻塞,并傳回一個大于0的值(即:準備好讀入的資料的位元組數).我們可以用socket選項SO_RCVLOWAT來設定此低潮限度,對于TCP和UDPsocket,其預設值為1;

 2.連接配接的讀這一半關閉(即:接收到對方發過來的FIN的TCP連接配接).對于這樣的socket的讀操作将不阻塞,并且傳回0(即:檔案結束符,FIN包體長度為0位元組);

 3.socket是一個用于監聽的socket,并且已經完成的連接配接數為非0.這樣的soocket處于可讀狀态,是因為socket收到了對方的connect請求,執行了三次握手的第一步:對方發送SYN請求過來,使監聽socket處于可讀狀态;正常情況下,這樣的socket上的accept操作不會阻塞;

 4.有一個socket有異常錯誤條件待處理.對于這樣的socket的讀操作将不會阻塞,并且傳回一個錯誤(-1),errno則設定成明确的錯誤條件.這些待處理的錯誤也可通過指定socket選項SO_ERROR調用getsockopt來取得并清除;

二、 下列三個條件中的任何一個滿足時,socket準備好寫 :

 1.socket發送緩沖區中的可用空間位元組數大于等于socket發送緩沖區低潮限度的目前值,且(i):socket已連接配接(TCP socket),或者(ii):socket不要求連接配接(如:UDP socket).這意味着,如果我們将這樣的socket設定為非阻塞模式,寫操作将不會阻塞,并且傳回一個正值(如:由傳輸層接收的位元組數).我們可以用socket選項SO_SNDLOWAT來設定此低潮限度,對于TCP和UDP socket,其預設值一般是2048Bytes;

 2.連接配接的寫這一半關閉.對于這樣的socket的的寫操作将産生信号SIGPIPE;

 3.有一個socket異常錯誤條件待處理.對于這樣的socket的寫操作将不會阻塞并且傳回一個錯誤(-1),errno則設定成明确的錯誤條件.這些待處理的錯誤也可以通過指定socket選項SO_ERROR調用getsockopt函數來取得并清除;  4.使用非阻塞式connect的套接字已建立連接配接,或者connect已經以失敗告終 (PS:這裡所說的連接配接的寫這一半關閉,連接配接的讀這一半關閉指的是這一端TCP調用shutdown系統調用來關閉自身的寫 自身的讀,而不是對方關閉讀導緻這端可以讀。)

繼續閱讀