ホームページ > バックエンド開発 > Golang > golang tcpはタイムアウトを設定します

golang tcpはタイムアウトを設定します

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2023-05-10 12:41:36
オリジナル
1507 人が閲覧しました

golang tcp のタイムアウト設定

golang を使用して tcp ネットワーク アプリケーションを作成する場合、タイムアウトが設定されていないと、ネットワーク接続が長時間停止する可能性があり、プログラムのパフォーマンスと安定性に影響します。したがって、golang tcp ネットワーク プログラミング プロセスでは、タイムアウトを適切に設定することも特に重要です。この記事では、プログラムの信頼性と安定性を向上させるために、golang で tcp タイムアウトを設定する方法を紹介します。

1. TCP 接続タイムアウトの設定

  1. DialTimeout と Dialer

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 関数のタイムアウト パラメータに似ていますが、より柔軟で、動的に設定できます。タイムアウト。

  1. 使用例

次に、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 関数を提供します。

  1. SetReadDeadline

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 秒に設定されています。この時間内に接続がデータを受信しない場合、接続はタイムアウトエラーメッセージ。

  1. SetWriteDeadline

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. 参考リンク

  1. net.Dialer: https://golang.org/pkg/net/#Dialer
  2. net.Conn.SetReadDeadline: https ://golang.org/pkg/net/#Conn.SetReadDeadline
  3. net.Conn.SetWriteDeadline: https://golang.org/pkg/net/#Conn.SetWriteDeadline
  4. Golang TCP クライアントの例: https://www.linode.com/docs/guides/developing-udp-and-tcp-clients-and-servers-in-go/#golang-tcp-client-example

以上がgolang tcpはタイムアウトを設定しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート