Тип net.Dialer

Тип net.Dialer предоставляет структуру для создания сетевых подключений с настраиваемыми параметрами. В отличие от функции net.Dial, которая использует значения по умолчанию, net.Dialer позволяет задать таймаут подключения, таймаут удержания соединения, локальный адрес и другие параметры. Основное поле структуры - Timeout, которое определяет максимальное время ожидания установки соединения.

Синтаксис

gotype 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-соединение с сайтом:

gopackage 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")
}

Результат выполнения кода:

go"Connected to example.com:80"

Пример с настройкой Keep-Alive

Настроим dialer с интервалом keep-alive в 30 секунд для поддержания активного соединения:

gopackage 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")
}

Результат выполнения кода:

go"Connected with keep-alive"

Пример с указанием локального адреса

Укажем локальный IP-адрес и порт для исходящего соединения с помощью поля LocalAddr:

gopackage 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")
}

Результат выполнения кода:

go"Connected from local address"

Пример с таймаутом через Deadline

Используем поле Deadline для установки абсолютного времени, до которого должно быть установлено соединение:

gopackage 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")
}

Результат выполнения кода:

go"Connected before deadline"

Смотрите также

  • функцию net.Dial,
    которая создает соединение с параметрами по умолчанию
  • функцию net.DialTimeout,
    которая создает соединение с таймаутом
  • тип net.Conn,
    который представляет интерфейс сетевого соединения
  • тип net.Resolver,
    который выполняет DNS-разрешение имен хостов