ホームページ >バックエンド開発 >Golang >Go の「net」パッケージで閉じられた TCP 接続を確実に検出するにはどうすればよいですか?

Go の「net」パッケージで閉じられた TCP 接続を確実に検出するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 10:39:28838ブラウズ

How Can I Reliably Detect Closed TCP Connections in Go's `net` Package?

ネット パッケージでの TCP 接続ステータスの監視

TCP サーバー実装の一般的なタスクは、クライアント接続がいつ閉じられたかを判断することです。この質問では、Go net パッケージで接続の切断を検出するための信頼できる方法を検討します。

切断された接続の確認

推奨されるアプローチは、読み取り操作と書き込み操作の両方を試行することです。どちらかが nil エラーを返すかどうかを確認します。両方の操作が成功した場合、接続は開いているとみなされます。ただし、この方法には制限があります。

タイムアウトを使用した信頼性の高い検出

より信頼性の高い解決策には、読み取り期限を設定し、1 バイトの読み取りを試行することが含まれます。読み取りが io.EOF エラーで完了した場合、接続は閉じられたとみなされます。遅いクライアントによる誤検知を防ぐために、ゼロ以外の読み取り期限を設定できます。

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  // Connection closed
}

タイムアウト検出

読み取りタイムアウトが期限切れになると、提供されたerror は net.Error インターフェイスを実装し、エラーの Timeout() メソッドを使用してエラーを確認できます。

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

Go 1.7 の考慮事項

Go 1.7 では、ゼロバイトの読み取りはエラーなしですぐに返されます。したがって、誤検知を回避するには、少なくとも 1 バイトが読み取られるようにすることが重要です。

以上がGo の「net」パッケージで閉じられた TCP 接続を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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