Тип net.UnixConn
Тип net.UnixConn представляет собой соединение с Unix-сокетом.
Он реализует интерфейс net.Conn и предоставляет дополнительные
методы для работы с Unix-адресами. В качестве первого параметра при создании
указывается тип сети ("unix", "unixgram", "unixpacket"), а во второй параметр
передается путь к файлу сокета.
Синтаксис
conn, err := net.Dial("unix", "/tmp/socket.sock")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
unixConn := conn.(*net.UnixConn)
Пример чтения из Unix-сокета
Давайте создадим клиент, который подключается к Unix-сокету и читает данные:
package 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]))
}
Результат выполнения кода:
"Получено 12 байт: Hello, World"
Пример записи в Unix-сокет
Отправим сообщение в Unix-сокет, используя метод Write:
package 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("Сообщение отправлено")
}
Результат выполнения кода:
"Сообщение отправлено"
Пример CloseRead и CloseWrite
Тип net.UnixConn позволяет закрыть отдельно чтение или запись:
package 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("Чтение и запись закрыты отдельно")
}
Результат выполнения кода:
"Чтение и запись закрыты отдельно"
Смотрите также
-
тип
net.UnixAddr,
который представляет адрес Unix-сокета -
интерфейс
net.Conn,
который реализуетnet.UnixConn -
функцию
net.Dial,
которая создает соединение с Unix-сокетом -
тип
net.TCPConn,
который представляет TCP-соединение