ネット パッケージでの 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 サイトの他の関連記事を参照してください。