Тип net.Dialer
Тип net.Dialer предоставляет структуру для создания сетевых подключений с настраиваемыми параметрами. В отличие от функции net.Dial, которая использует значения по умолчанию, net.Dialer позволяет задать таймаут подключения, таймаут удержания соединения, локальный адрес и другие параметры. Основное поле структуры - Timeout, которое определяет максимальное время ожидания установки соединения.
Синтаксис
type Dialer struct {
Timeout time.Duration
Deadline time.Time
LocalAddr Addr
DualStack bool
KeepAlive time.Duration
Resolver *Resolver
}
Для создания нового экземпляра Dialer используется литерал структуры с указанием необходимых полей. Метод Dial принимает сетевой протокол (например, "tcp" или "udp") и адрес в формате "host:port", возвращая объект Conn для работы с установленным соединением.
Пример с таймаутом подключения
Давайте создадим dialer с таймаутом подключения в 5 секунд и установим TCP-соединение с сайтом:
package main
import (
"fmt"
"net"
"time"
)
func main() {
dialer := &net.Dialer{
Timeout: 5 * time.Second,
}
conn, err := dialer.Dial("tcp", "example.com:80")
if err != nil {
fmt.Println("Error:", err)
return
}
defer conn.Close()
fmt.Println("Connected to example.com:80")
}
Результат выполнения кода:
"Connected to example.com:80"
Пример с настройкой Keep-Alive
Настроим dialer с интервалом keep-alive в 30 секунд для поддержания активного соединения:
package main
import (
"fmt"
"net"
"time"
)
func main() {
dialer := &net.Dialer{
Timeout: 10 * time.Second,
KeepAlive: 30 * time.Second,
}
conn, err := dialer.Dial("tcp", "google.com:80")
if err != nil {
fmt.Println("Error:", err)
return
}
defer conn.Close()
fmt.Println("Connected with keep-alive")
}
Результат выполнения кода:
"Connected with keep-alive"
Пример с указанием локального адреса
Укажем локальный IP-адрес и порт для исходящего соединения с помощью поля LocalAddr:
package main
import (
"fmt"
"net"
"time"
)
func main() {
localAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0")
if err != nil {
fmt.Println("Resolve error:", err)
return
}
dialer := &net.Dialer{
Timeout: 5 * time.Second,
LocalAddr: localAddr,
}
conn, err := dialer.Dial("tcp", "example.com:80")
if err != nil {
fmt.Println("Dial error:", err)
return
}
defer conn.Close()
fmt.Println("Connected from local address")
}
Результат выполнения кода:
"Connected from local address"
Пример с таймаутом через Deadline
Используем поле Deadline для установки абсолютного времени, до которого должно быть установлено соединение:
package main
import (
"fmt"
"net"
"time"
)
func main() {
deadline := time.Now().Add(3 * time.Second)
dialer := &net.Dialer{
Deadline: deadline,
}
conn, err := dialer.Dial("tcp", "example.com:80")
if err != nil {
fmt.Println("Dial error:", err)
return
}
defer conn.Close()
fmt.Println("Connected before deadline")
}
Результат выполнения кода:
"Connected before deadline"
Смотрите также
-
функцию
net.Dial,
которая создает соединение с параметрами по умолчанию -
функцию
net.DialTimeout,
которая создает соединение с таймаутом -
тип
net.Conn,
который представляет интерфейс сетевого соединения -
тип
net.Resolver,
который выполняет DNS-разрешение имен хостов