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

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

尚
原創
2020-01-13 10:44:503925瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:golang如何打包下一篇:golang如何打包