ホームページ >バックエンド開発 >Golang >Go の「net」パッケージで TCP 接続の終了を確実に検出する方法

Go の「net」パッケージで TCP 接続の終了を確実に検出する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 04:58:16366ブラウズ

How to Reliably Detect TCP Connection Closure in Go's `net` Package?

ネット パッケージでの TCP 接続の終了の検出

TCP サーバーでは、クライアントがいつ接続を終了したかを判断することが重要です。この記事では、ネット パッケージでこれを効果的に検出する方法について説明します。

質問で提案されている、エラー チェックを伴う読み取りまたは書き込み操作に依存するアプローチはお勧めできません。代わりに、より信頼性の高い方法は、読み取り期限を設定し、特定のエラー状態をチェックすることです。

推奨アプローチ:

次のコード スニペットは、「最良の方法」から抜粋したものです。 TCP 接続が閉じられていることを確実に検出するには」スレッドで、推奨される方法を示します。アプローチ:

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
  c.Close()
  c = nil
} else {
  var zero time.Time
  c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}

説明:

  • SetReadDeadline は、それを超えると読み取り操作がタイムアウト エラーで失敗する時間を設定します。
  • 読み取りで EOF が返されない場合は、後続の操作でタイムアウトをチェックするために新しい期限が設定されます。

タイムアウト検出:

タイムアウト検出の場合、次のコードを使用できます。 used:

if neterr, ok := err.(net.Error); ok & neterr.Timeout() {
  ...
}

これは、エラーが net.Error であるかどうかをチェックします。これには、Timeout() などの追加情報が含まれています。

Updates:

Go 1.7 以降では、ゼロバイトの読み取りはエラーなしですぐに返されます。したがって、少なくとも 1 バイトを読み取ることをお勧めします。

以上がGo の「net」パッケージで TCP 接続の終了を確実に検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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