Тип net.UnixConn

Тип net.UnixConn представляет собой соединение с Unix-сокетом. Он реализует интерфейс net.Conn и предоставляет дополнительные методы для работы с Unix-адресами. В качестве первого параметра при создании указывается тип сети ("unix", "unixgram", "unixpacket"), а во второй параметр передается путь к файлу сокета.

Синтаксис

goconn, err := net.Dial("unix", "/tmp/socket.sock")
if err != nil {
  log.Fatal(err)
}
defer conn.Close()

unixConn := conn.(*net.UnixConn)

Пример чтения из Unix-сокета

Давайте создадим клиент, который подключается к Unix-сокету и читает данные:

gopackage main

import (
  "fmt"
  "log"
  "net"
  "os"
)

func main() {
  // Подключаемся к Unix-сокету
  conn, err := net.Dial("unix", "/tmp/socket.sock")
  if err != nil {
    log.Fatal(err)
  }
  defer conn.Close()

  // Приводим к типу UnixConn
  unixConn := conn.(*net.UnixConn)

  // Читаем данные из сокета
  buf := make([]byte, 1024)
  n, err := unixConn.Read(buf)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Получено %d байт: %s\n", n, string(buf[:n]))
}

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

go"Получено 12 байт: Hello, World"

Пример записи в Unix-сокет

Отправим сообщение в Unix-сокет, используя метод Write:

gopackage main

import (
  "log"
  "net"
)

func main() {
  // Подключаемся к Unix-сокету
  conn, err := net.Dial("unix", "/tmp/socket.sock")
  if err != nil {
    log.Fatal(err)
  }
  defer conn.Close()

  unixConn := conn.(*net.UnixConn)

  // Отправляем сообщение
  msg := []byte("Hello from client")
  _, err = unixConn.Write(msg)
  if err != nil {
    log.Fatal(err)
  }

  log.Println("Сообщение отправлено")
}

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

go"Сообщение отправлено"

Пример CloseRead и CloseWrite

Тип net.UnixConn позволяет закрыть отдельно чтение или запись:

gopackage main

import (
  "log"
  "net"
)

func main() {
  conn, err := net.Dial("unix", "/tmp/socket.sock")
  if err != nil {
    log.Fatal(err)
  }
  defer conn.Close()

  unixConn := conn.(*net.UnixConn)

  // Закрываем только чтение
  err = unixConn.CloseRead()
  if err != nil {
    log.Fatal(err)
  }

  // Закрываем только запись
  err = unixConn.CloseWrite()
  if err != nil {
    log.Fatal(err)
  }

  log.Println("Чтение и запись закрыты отдельно")
}

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

go"Чтение и запись закрыты отдельно"

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

  • тип net.UnixAddr,
    который представляет адрес Unix-сокета
  • интерфейс net.Conn,
    который реализует net.UnixConn
  • функцию net.Dial,
    которая создает соединение с Unix-сокетом
  • тип net.TCPConn,
    который представляет TCP-соединение