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)) }
説明:
タイムアウト検出:
タイムアウト検出の場合、次のコードを使用できます。 used:
if neterr, ok := err.(net.Error); ok & neterr.Timeout() { ... }
これは、エラーが net.Error であるかどうかをチェックします。これには、Timeout() などの追加情報が含まれています。
Updates:
Go 1.7 以降では、ゼロバイトの読み取りはエラーなしですぐに返されます。したがって、少なくとも 1 バイトを読み取ることをお勧めします。
以上がGo の「net」パッケージで TCP 接続の終了を確実に検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。