天天看點

socket可讀可寫條件與非阻塞connect/accept淺析

socket可讀的條件:

  1. socket的接收緩沖區中的資料位元組大于等于該socket的接收緩沖區低水位标記的目前大小。對這樣的socket的讀操作将不阻塞并傳回一個大于0的值(也就是傳回準備好讀入的資料)。我們可以用SO_RCVLOWATsocket選項來設定該socket的低水位标記。對于TCP和UDP .socket而言,其預設值為1.
  2. 該連接配接的讀這一半關閉(也就是接收了FIN的TCP連接配接)。對這樣的socket的讀操作将不阻塞并傳回0
  3. 給監聽套接字準備好新連接配接
  4. 有一個socket有異常錯誤條件待處理.對于這樣的socket的讀操作将不會阻塞,并且傳回一個錯誤(-1),errno則設定成明确的錯誤條件.這些待處理的錯誤也可通過指定socket選項SO_ERROR調用getsockopt來取得并清除;

socket可寫的條件:

  1. socket的發送緩沖區中的資料位元組大于等于該socket的發送緩沖區低水位标記的目前大小。對這樣的socket的寫操作将不阻塞并傳回一個大于0的值(也就是傳回準備好寫入的資料)。我們可以用SO_SNDLOWAT socket選項來設定該socket的低水位标記。對于TCP和UDPsocket而言,其預設值為2048
  2. 該連接配接的寫這一半關閉。對這樣的socket的寫操作将産生SIGPIPE信号,該信号的預設行為是終止程序。
  3. 使用非阻塞connect的套接字已建立連接配接, 或者connect已經以失敗告終
  4. 有一個socket異常錯誤條件待處理.對于這樣的socket的寫操作将不會阻塞并且傳回一個錯誤(-1),errno則設定成明确的錯誤條件.這些待處理的錯誤也可以通過指定socket選項SO_ERROR調用getsockopt函數來取得并清除;

非阻塞connect/accept相關

述的各種條件可以大體總結為下圖

socket可讀可寫條件與非阻塞connect/accept淺析

注意 : 當socket異常錯誤的時候socket是可讀并可寫的, 是以在非阻塞connect(判斷是否可寫)/accept(判斷是否可讀)的時候要特别注意這種情況, 要用getsockopt函數, 使用SO_ERROR選項來檢查處理.

繼續閱讀