網絡編程中,咱們常常討論等待某個描述符準備好I/O(讀/寫)或者等待其上發生一個待處理的異常條件。儘管可讀性和可寫性對於普通文件這樣的描述符顯而易見,然而對於引發諸如select返回套接字「就緒」的條件咱們必須討論的更明確些。編程
a)該套接字接受緩衝區中的數據字節數大於等於套接字接受緩衝區低水位標記的當前大小。對這樣的套接字執行讀操做不會阻塞並將返回一個大於0的值(也網絡
就是返回準備好讀入的數據)。咱們能夠使用SO_RCVLOWAT套接字選項設置該套接字的低水位標記。對於tcp和udp套接字而言,其默認值爲1。
tcp
b)該套接字的讀半部關閉(也就是接受了FIN的tcp鏈接)。對這樣的套接字的讀操做將不阻塞並返回0.(也就是返回EOF)get
c)該套接字是一個監聽套接字且已完成的鏈接數不爲0。對這樣的套接字的accept一般不阻塞。(後邊可會發文介紹阻塞accept的一種時序條件)網絡編程
d)其上有一個套接字錯誤待處理。對這樣的套接字的讀操做將不阻塞並返回-1(也就是返回一個錯誤),同時把errno設置成確切的錯誤條件。這樣待處理錯誤(pending error)也能夠經過指定SO_ERROR套接字選項調用getsockopt獲取並清除。select
a)該套接字發送緩衝區中的可用空間字節數大於等於套接字發送緩衝區低水位標記的當前大小,而且或者該套接字已鏈接,或者該套接字不須要鏈接(如udp套接udp
字)。這意味着若是咱們把這樣的套接字設置成非阻塞,寫操做將不阻塞並返回一個正值(例如由傳輸層接受的字節數)。咱們能夠使用SO_SNDLOWAT套接字選項來設error
置該套接字的低水位標記。對於tcp和udp而言,其默認值一般爲2048。數據
b)該鏈接的寫半部關閉。對這樣的套接字的寫操做將產生SIGPIPE信號。異常
c) 使用非阻塞connect的套接字已創建鏈接,或者connect已經以失敗了結。
d) 其上有一個套接字錯誤待處理。對這樣的套接字的寫操做將不阻塞並返回-1(也就是返回一個錯誤),同時把errno設置成確切的錯誤條件。這些待處理的錯
誤也能夠經過指定SO_ERROR套接字選項調用getsockopt獲取並清除。
注意:當某個套接字上發生錯誤時,它將select標記爲便可讀又可寫。