轉載:http://blog.csdn.net/embedded_sky/article/details/42077321
對於TCP長連接保活是十分必要的,原因如下:
1、系統多在OA網和外網間有防火牆隔離,很多防火牆對一段時間內沒有報文活動的socket會自動關閉。
2、對於非正常斷開的連接系統並不能偵測到,比如防火牆關閉端口、網線被拔掉、電腦突然奔掉、未關閉應用程序直接關機(服務端無法釋放資源)。
(調用close(fd)爲正常斷開,連接對端可以偵測到)
TCP長連接保持的兩種辦法:
1) 應用層面的心跳機制
自定義心跳消息頭.,一般客戶端主動發送到服務端,服務器接收後進行迴應(也可以不迴應),以便能夠偵測連接是否異常斷開。
2) TCP協議自帶的保活功能
通過設置TCP keepalive的屬性,打開socket的keepalive屬性,並設置發送底層心跳包的時間間隔。TCP/IP五層網絡模型,我們調用socket等接口是應用層的函數,TCP keepalive是在底層定時發送心跳報文,服務器端接收到底層的心跳報文直接丟棄,不關心其內容。
使用TCP keepalive來保持長連接狀態顯然要舒服一些,直接調用系統的API即可實現,對於系統而言負擔也更輕(相對第一種辦法)。
以下是windows下TCP keepalive設置的函數。