天天看點

freebsd socket send逾時或者拔出網線也不會出現錯誤的情況

在伺服器端建立了socket,然後和用戶端建立心跳檢測,結果用戶端關閉或者拔出網線在短時間内(10分鐘之後)才會發現用戶端關閉了連接配接。

解決法案:在伺服器端設定socket的keepalive屬性。

int keepalive = 1; // 開啟keepalive屬性

int keepidle = 60; // 如該連接配接在60秒内沒有任何資料往來,則進行探測

int keepinterval = 5; // 探測時發包的時間間隔為5 秒

int keepcount = 3; // 探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));

setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle ));

setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval ));

setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount ));

每次調用recv或send時檢查傳回值,判斷是否出錯或為0.如果出錯,再檢查errno查資料,看哪個或哪幾個錯誤号表示連結斷了或不存在就可 以了。

繼續閱讀