首頁 > 後端開發 > Golang > golang怎麼判斷套接字是否關閉

golang怎麼判斷套接字是否關閉

發布: 2020-01-13 10:44:50
原創
4001 人瀏覽過

golang怎麼判斷套接字是否關閉

套接字(socket)是一個抽象層,應用程式可以透過它發送或接收數據,可對其進行像對檔案一樣的開啟、讀寫和關閉等操作。

方法一:

當recv()回傳值小於等於0時,socket連線中斷。但還要判斷 errno是否等於 EINTR,如果errno == EINTR 則表示recv函數是因為程式接收到訊號後回傳的,socket連線還是正常的,不應close掉socket連線。

方法二:

  struct tcp_info info; 
  int len=sizeof(info); 
  getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
  if((info.tcpi_state==TCP_ESTABLISHED))  则说明未断开  else 断开
登入後複製

方法三:

若使用了select等系統函數,若遠端斷開,則select回傳1,recv回傳0則斷開。其他注意事項同法一。

法四:

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));
登入後複製

設定後,若斷開,則在使用該socket讀寫時立即失敗,並返回ETIMEDOUT錯誤

更多golang知識請關注PHP中文網站golang教學專欄。

以上是golang怎麼判斷套接字是否關閉的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板