ホームページ  >  記事  >  バックエンド開発  >  golangでソケットが閉じられているかどうかを確認する方法

golangでソケットが閉じられているかどうかを確認する方法

尚
オリジナル
2020-01-13 10:44:503867ブラウズ

golangでソケットが閉じられているかどうかを確認する方法

ソケットは、アプリケーションがデータを送受信したり、ファイルのように開いたり、読み取ったり、書き込んだり、閉じたりできる抽象化レイヤーです。

方法 1:

recv() の戻り値が 0 以下の場合、ソケット接続は切断されます。ただし、errno が EINTR と等しいかどうかを判断することも必要です。errno == EINTR の場合、プログラムがシグナルを受信した後に recv 関数が戻ることを意味します。ソケット接続はまだ正常であるため、ソケット接続を閉じるべきではありません。

方法 2:

  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 断开

方法 3:

select などのシステム関数が使用され、リモート エンドが切断された場合、select は 1 を返し、recv は切断するために 0 を返します。 。その他の注意事項は第1条と同様です。

方法 4:

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));

設定後、切断された場合、ソケットを使用した読み取りと書き込みはすぐに失敗し、ETIMEDOUT エラーが返されます

Golang の詳細については、お支払いください。 PHP 中国語 Web サイト golang チュートリアル のコラムに注目してください。

以上がgolangでソケットが閉じられているかどうかを確認する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。