首頁 > 後端開發 > Golang > golang tcp 設定超時

golang tcp 設定超時

WBOY
發布: 2023-05-10 12:41:36
原創
1444 人瀏覽過

golang tcp 設定逾時

在使用golang編寫tcp網路應用程式的時候,如果不設定逾時,可能會導致網路連線長時間處於卡住狀態,進而影響程式的效能和穩定性。因此,在golang tcp網路程式設計過程中,合理設定逾時也變得尤為重要。本篇文章將介紹如何在golang中設定tcp逾時,以提高程式的可靠性和穩定性。

一、設定tcp連線逾時

  1. DialTimeout和Dialer

golang中有兩種設定tcp連線逾時的方法:使用DialTimeout 或使用Dialer 。其中,DialTimeout 是Dialer的一個簡化版本。

DialTimeout函數的定義如下:

func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
登入後複製

其中,第三個參數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函數的timeout參數類似,但更靈活,可以動態地設定逾時時間。

  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*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物件dialer來設定了連線逾時時間為3秒,並透過dialer.Dial函數來建立tcp連線。如果在3秒內沒有建立連接,將會傳回一個錯誤訊息。

二、設定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秒,如果連接在此時間內沒有發送完數據,將會傳回一個超時錯誤訊息。

三、參考連結

  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 Client Example: https://www.linode.com/docs/guides/developing-udp-and-tcp-clients-and-servers-in-go/#golang-tcp-client-example
#

以上是golang tcp 設定超時的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板