golang tcp のタイムアウト設定
golang を使用して tcp ネットワーク アプリケーションを作成する場合、タイムアウトが設定されていないと、ネットワーク接続が長時間停止する可能性があり、プログラムのパフォーマンスと安定性に影響します。したがって、golang tcp ネットワーク プログラミング プロセスでは、タイムアウトを適切に設定することも特に重要です。この記事では、プログラムの信頼性と安定性を向上させるために、golang で tcp タイムアウトを設定する方法を紹介します。
1. TCP 接続タイムアウトの設定
Golang で TCP 接続タイムアウトを設定するには、DialTimeout を使用するか、Dialer を使用する 2 つの方法があります。 。このうち、DialTimeout は Dialer の簡易版です。
DialTimeout 関数は次のように定義されます。
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
3 番目のパラメーター timeout は接続タイムアウトを指定します。この時間内に接続が確立されない場合は、エラー メッセージが返されます。
Dialer は、タイムアウトをより柔軟に設定できます。これは次のように定義されます。
type Dialer struct { Timeout time.Duration KeepAlive time.Duration Resolver *Resolver DualStack bool FallbackDelay time.Duration Control func(network, address string, c syscall.RawConn) error }
Dialer の Timeout プロパティは、DialTimeout 関数のタイムアウト パラメータに似ていますが、より柔軟で、動的に設定できます。タイムアウト。
次に、DialTimeout 関数を使用して TCP 接続タイムアウトを設定する例を示します。
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close()
上記のコードでは、 DialTimeout 関数の 3 番目のパラメータ 3*time.Second は、接続タイムアウトを 3 秒に指定します。この時間内に接続が確立されない場合は、エラー メッセージが返されます。
Dialer を使用して TCP 接続タイムアウトを実装する場合は、次のようにすることができます:
dialer := &net.Dialer{ Timeout: 3 * time.Second, } conn, err := dialer.Dial("tcp", "127.0.0.1:9000") if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close()
上記のコードでは、Dialer オブジェクトのダイヤラーを使用して接続タイムアウトを 3 秒に設定し、 TCP 接続を確立するためのdialer.Dial 関数。 3 秒以内に接続が確立されない場合は、エラー メッセージが返されます。
2. TCP 読み取りおよび書き込みタイムアウトの設定
TCP 接続を確立した後、長時間の待機や応答の遅さを避けるために、読み取りおよび書き込みタイムアウトも設定する必要があります。 golang の net パッケージは、Conn が読み取りおよび書き込みタイムアウトを設定するための SetReadDeadline および SetWriteDeadline 関数を提供します。
SetReadDeadline 関数は、TCP 読み取りタイムアウトを設定するために使用されます。
func (c *TCPConn) SetReadDeadline(t time.Time) error
この関数のパラメータ t は、設定された読み取りタイムアウトを表します。この時間内にデータが受信されない場合は、エラー メッセージが返されます。
使用例:
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close() _, err = conn.Write([]byte("hello")) if err != nil { fmt.Println("failed to write:", err) return } if err = conn.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { fmt.Println("failed to set read deadline:", err) } buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { fmt.Println("failed to read:", err) return } fmt.Println(string(buf[:n]))
上記のコードでは、conn.SetReadDeadline 関数によって tcp 読み取りタイムアウトが 3 秒に設定されています。この時間内に接続がデータを受信しない場合、接続はタイムアウトエラーメッセージ。
SetWriteDeadline 関数は、TCP 書き込みタイムアウトを設定するために使用されます。
func (c *TCPConn) SetWriteDeadline(t time.Time) error
この関数のパラメータ t は、設定された書き込みタイムアウト時間を表します。この時間内にデータが送信されない場合は、エラー メッセージが返されます。
使用例:
conn, err := net.DialTimeout("tcp", "127.0.0.1:9000", 3*time.Second) if err != nil { fmt.Println("failed to connect:", err) return } defer conn.Close() if err = conn.SetWriteDeadline(time.Now().Add(3 * time.Second)); err != nil { fmt.Println("failed to set write deadline:", err) } _, err = conn.Write([]byte("hello")) if err != nil { fmt.Println("failed to write:", err) return }
上記のコードでは、conn.SetWriteDeadline 関数によって tcp 書き込みタイムアウトが 3 秒に設定されています。接続がこの時間内にデータの送信を終了しない場合、タイムアウトエラーメッセージが返されます。
3. 参考リンク
以上がgolang tcpはタイムアウトを設定しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。