1、
下列四個條件中的任何一個知足時,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來取得並清除;
2、
下列三個條件中的任何一個知足時,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函數來取得並清除;