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來取得並清除; 

注:可讀其實是看read或accept操作是否在阻塞的情況下返回,如果能返回表明可讀(返回可讀的字節數,或者-1,errno記錄錯誤值),否則一直阻塞,表明不可讀。

   accept的情況是客戶端connect,已經與服務端三次握手了,此時監聽的socket處於可讀狀態,這樣如果select,此時返回不會阻塞,或者直接accept也不會阻塞。


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


 1,socket發送緩衝區中的可用空間字節數大於等於socket發送緩衝區低潮限度的當前值,且(i):socket已連接(TCP socket),或者(ii):socket不要求連接(如:UDP socket).這意味着,如果我們將這樣的socket設置爲非阻塞模式,寫操作將不會阻塞,並且返回一個正值(如:由傳輸層接收的字節數).我們可以用socket選項SO_SNDLOWAT來設置此低潮限度,對於TCP和UDP socket,其缺省值一般是2048Bytes; 
 2,連接的寫這一半關閉.對於這樣的socket的的寫操作將產生信號SIGPIPE; (write操作會返回-1)

 3,使用非阻塞connect的套接字已建立連接,或者connect已經以失敗告終(失敗的時候其實是既可讀又可寫)。
 4,有一個socket異常錯誤條件待處理.對於這樣的socket的寫操作將不會阻塞並且返回一個錯誤(-1),errno則設置成明確的錯誤條件.這些待處理的錯誤也可以通過指定socket選項SO_ERROR調用getsockopt函數來取得並清除;

 

注:當某個套接字上發生錯誤時,它將select標記爲即可讀又可寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章