天天看點

socket可讀可寫

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

  1. socket的接受緩沖區中的資料大于等于該socket的接收緩沖區低水位标記的目前的大小。對于這樣的socket的讀操作将不堵塞并傳回一個大于0的值。我們可以用SO_RCVLOWAT 這個socket選項來設定該socket的低水位值。預設值位1.
  2. 該連接配接的讀這一半關閉(也就是接收了FIN的TCP連接配接)。對于這樣的socket将不堵塞傳回0.
  3. socket 是一個用于監聽的socket,并且已經完成的連接配接數不為0。這樣的socket處于可讀狀态,是因為socket收到了對方的connect請求,執行了三次握手的第一步;對方發送SYN請求過來,使監聽socket處于可讀狀态。正常情況下,這樣的socket上的 accept将不堵塞放回。
  4. 有一個socket有異常錯誤條件待處理。對于這樣的socket的讀操作将不堵塞,并且傳回錯誤-1,errno則設定成明确的錯誤條件。這些待處理的錯誤也可通過socket選項SO_ERROR調用擷取并清除。

socket的可寫條件

二、下列三個條件中的任何一個滿足時,socket處于可寫狀态。

  1. socket的發送緩沖區中的資料位元組大于等于該socket的發送緩沖區低水位标記目前的大小。對于這樣的socket的寫操作将不堵塞并傳回一個大于0的值(也就是可寫的大小)。我們可以用SO_SNDLOWAT 這個socket選項來設定該socket的低水位标記。預設值為 2048。
  2. 該連接配接的寫一半關閉。對于這樣的socket将不堵塞傳回0.
  3. 有一個socket異常錯誤條件待處理。對于這樣的socket的寫操作将不堵塞,并且傳回錯誤-1. errno則設定成明确的錯誤條件。這些待處理的錯誤可通過socket選項SO_ERROR調用擷取并清除。

繼續閱讀