Rumah >pembangunan bahagian belakang >Golang >golang tcp set timeout
tamat masa tetapan tcp golang
Apabila menggunakan golang untuk menulis aplikasi rangkaian tcp, jika anda tidak menetapkan tamat masa, sambungan rangkaian mungkin tersekat untuk masa yang lama, yang akan menjejaskan prestasi dan kestabilan program. Oleh itu, dalam proses pengaturcaraan rangkaian tcp golang, adalah juga penting untuk menetapkan tamat masa secara munasabah. Artikel ini akan memperkenalkan cara untuk menetapkan tamat masa tcp dalam golang untuk meningkatkan kebolehpercayaan dan kestabilan program.
1. Tetapkan tamat masa sambungan tcp
Terdapat dua cara untuk menetapkan tamat masa sambungan tcp dalam golang: gunakan DialTimeout atau gunakan Dialer . Antaranya, DialTimeout ialah versi Dialer yang dipermudahkan.
Fungsi DialTimeout ditakrifkan seperti berikut:
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
Antaranya, tamat masa parameter ketiga menentukan tamat masa sambungan. Jika sambungan tidak diwujudkan dalam masa ini, mesej ralat akan dikembalikan.
Pendail boleh menetapkan tamat masa dengan lebih fleksibel, yang ditakrifkan seperti berikut:
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 }
Sifat Tamat Masa Dialer adalah serupa dengan parameter tamat masa fungsi DialTimeout, tetapi lebih fleksibel dan boleh menetapkan tamat masa secara dinamik.
Berikut ialah contoh penggunaan fungsi DialTimeout untuk menetapkan tamat masa sambungan 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()
Dalam kod di atas, parameter ketiga bagi fungsi DialTimeout 3*time.Second menentukan tempoh tamat sambungan menjadi 3 saat. Jika sambungan tidak diwujudkan dalam masa ini, mesej ralat akan dikembalikan.
Jika anda menggunakan Dialer untuk melaksanakan tamat masa sambungan tcp, anda boleh melakukan ini:
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()
Dalam kod di atas, dialer objek Dialer digunakan untuk menetapkan tamat masa sambungan kepada 3 saat, dan melalui pendail.Fungsi dail untuk mewujudkan sambungan tcp. Jika sambungan tidak diwujudkan dalam masa 3 saat, mesej ralat akan dikembalikan.
2. Tetapkan tamat masa baca dan tulis tcp
Selepas membuat sambungan tcp, anda juga perlu menetapkan tamat baca dan tulis untuk mengelakkan menunggu lama atau respons lambat. Pakej bersih dalam golang menyediakan fungsi SetReadDeadline dan SetWriteDeadline untuk Conn untuk menetapkan tamat masa baca dan tulis.
Fungsi SetReadDeadline digunakan untuk menetapkan tamat masa baca tcp. Ia ditakrifkan sebagai:
func (c *TCPConn) SetReadDeadline(t time.Time) error
Parameter t fungsi ini mewakili tamat masa baca yang ditetapkan Jika tiada data diterima dalam masa ini, mesej ralat akan dikembalikan.
Contoh penggunaan:
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]))
Dalam kod di atas, tamat masa baca tcp ditetapkan kepada 3 saat melalui fungsi conn.SetReadDeadline Jika sambungan tidak menerima data dalam masa ini, akan dikembalikan mesej ralat Tamat masa.
Fungsi SetWriteDeadline digunakan untuk menetapkan tamat masa tulis tcp. Ia ditakrifkan sebagai:
func (c *TCPConn) SetWriteDeadline(t time.Time) error
Parameter t fungsi ini mewakili tamat masa tulis yang ditetapkan Jika data tidak dihantar dalam masa ini, mesej ralat akan dikembalikan.
Contoh penggunaan:
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 }
Dalam kod di atas, tamat masa tulis tcp ditetapkan kepada 3 saat melalui fungsi conn.SetWriteDeadline Jika sambungan tidak menghantar data dalam masa ini, akan dikembalikan mesej ralat Tamat masa.
3. Pautan rujukan
Atas ialah kandungan terperinci golang tcp set timeout. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!