Tcp是面向連接的,在實際應用中通常都需要檢測連接是否還可用.如果不可用,可分為:
a. 連接的對端正常關閉.
b. 連接的對端非正常關閉,這包括對端設備掉電,程序崩潰,網絡被中斷等.這種情況是不能也無法通知對端的,所以連接會一直存在,浪費國家的資源.
tcp協議棧有個keepalive的屬性,可以主動探測socket是否可用,不過這個屬性的默認值很大.
全局設置可更改/etc/sysctl.conf,加上:
|
在程序中設置如下:
|
在程序中表現為,當tcp檢測到對端socket不再可用時(不能發出探測包,或探測包沒有收到ACK的響應包),select會返回socket可讀,并且在recv時返回-1,同時置上errno為ETIMEDOUT。
新聞熱點
疑難解答