UNIX網絡編程中的描述字就緒條件

我們一直在討論等待某個描述字準備好 I/O (讀或寫)或是其上發生一個待處理的異常條件(帶外數據)。儘管可讀性和可寫性對於普通文件這樣的描述字顯而易見,然而對於引起 select 返回套接口就緒的條件要更爲複雜一些。

1、下列四個條件中的任何一個滿足時,一個套接口準備好

  • 該套接口接收緩衝區中的數據字節數大於等於套接口接收緩衝區低潮標記的當前大小。對這樣的套接口的讀操作將不阻塞並返回一個大於0 的值(也就是返回準備好讀入的數據字節數)。可以使用 SO_RCVLOWAT 套接口選項設置該套接口的低潮標記。對於 TCP 和 UDP 套接口而言,其缺省值爲 1。

  • 該連接的讀這一半關閉(也就是接收了 FIN 的 TCP 連接)。對這樣的套接口的讀操作將不阻塞並返回 0(也就是返回 EOF )。

  • 該套接口是一個監聽套接口並且已完成的連接數不爲 0。對這樣的套接口的 accept 通常不會阻塞。

  • 套接口上有一個套接口錯誤待處理。對這樣的套接口的讀操作將不阻塞並返回 -1 (也就是返回一個錯誤),同時把 errno 設置成確切的錯誤條件。這些待處理的錯誤( pending error)也可以通過指定 SO_ERROR 套接口選項調用 getsockopt 獲取並清除。

2、下列四個條件中的任何一個滿足時,一個套接口準備好寫:

  • 該套接口發送緩衝區中的可用空間字節數大於或等於套接口發送緩衝區低潮標記的當前大小,並且或者該套接口已連接,或者該套接口不需要連接(例如 UDP 套接口)。這意味着如果我們把這樣的套接口設置成非阻塞,寫操作將不阻塞並返回一個正值(例如由傳輸層接受的字節數)。我們可以使用 SO_SNDLOWAT 套接口選項來設置該套接口的低潮標記。對於 TCP 和 UDP 套接口而言,其缺省值通常爲 2048。

  • 該連接的寫這一半關閉。對這樣的套接口的寫操作將產生 SIGPIPE 信號。

  • 該套接口早先使用非阻塞模式 connect 以建立連接,並且連接已經異步建立,或者 connect 已經以失敗告終。

  • 套接口上有一個套接口錯誤待處理。對這樣的套接口的寫操作將不阻塞並返回 -1(也就是返回一個錯誤),同時把 errno 設置程確切的錯誤條件。這些待處理的錯誤也可以通過指定  SO_ERROR 套接口選項調用 getsockopt 獲取並清除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章