Go の net パッケージでの TCP 接続の終了の検出
TCP サーバーを実装する場合、クライアント接続を監視することが重要です。クライアントが接続を閉じたかどうかを判断するには、読み取り/書き込み操作のみに依存しないようにすることが重要です。代わりに、包括的なアプローチをお勧めします。
推奨方法:
スレッド「TCP 接続が閉じられていることを確実に検出する最良の方法」では、次の組み合わせを使用することを提案しています。 SetReadDeadline() および Read() 関数:
one := make([]byte, 1) c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { // Client has closed the connection c.Close() c = nil } else { c.SetReadDeadline(time.Now().Add(10 * time.Millisecond)) }
読み取り操作にタイムアウトを設定することで、次のことを決定できます。 io.EOF エラーに基づいて接続が閉じられているかどうか。
タイムアウト検出:
読み取り操作中にタイムアウトが発生した場合に備えて、Go ドキュメントにガイダンスが記載されています。 :
if neterr, ok := err.(net.Error); ok && neterr.Timeout() { // Handle timeout }
Go 1.7 のアップデート:
Go バージョン 1.7 以降では、ゼロバイトの読み取りはエラーなしですぐに返されることに注意してください。したがって、少なくとも 1 バイトが読み取られるようにすることが重要です。
結論として、SetReadDeadline()、Read()、およびHandlingtimeouts を含む堅牢なアプローチにより、Go のネット パッケージで TCP 接続の終了を確実に検出できます。
以上がGo で TCP 接続の終了を確実に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。