Модуль std::net

Сетевая функциональность для TCP/UDP-связи.

Этот модуль предоставляет сетевую функциональность для протоколов Transmission Control Protocol (TCP) и User Datagram Protocol (UDP).

Это руководство разделено на три основных раздела:

  • TCP - тип TcpListener и TcpStream
  • UDP - тип UdpSocket
  • Универсальные рассмотрения - адресация и преобразование имен

TCP

TCP - это надежный протокол потоковой передачи по протоколу Интернет (IP). Подключение TCP устанавливается с помощью трёхстороннего рукопожатия, которое обеспечивает надежное соединение между двумя узлами.

Использование TCP осуществляется двумя способами:

  • либо путем прослушивания входящих подключений с помощью TcpListener
  • либо путем подключения к удаленному узлу с помощью TcpStream

Создание TCP-сервера с привязкой к адресу 127.0.0.1:8080:

use std::net::{TcpListener, TcpStream};

fn handle_client(stream: TcpStream) {
    // обработка подключения
}

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;

    // принимаем входящие подключения и обрабатываем их
    for stream in listener.incoming() {
        handle_client(stream?);
    }
    Ok(())
}

Подключение к удаленному серверу по адресу 127.0.0.1:8080:

use std::net::TcpStream;

fn main() -> std::io::Result<()> {
    let stream = TcpStream::connect("127.0.0.1:8080")?;
    // используем stream...
    Ok(())
}

UDP

UDP - это ненадежный протокол дейтаграмм по протоколу Интернет (IP). UDP-сообщения (пакеты) отправляются без установления предварительного соединения.

Использование UDP осуществляется с помощью UdpSocket:

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    {
        let socket = UdpSocket::bind("127.0.0.1:34254")?;

        // читаем из сокета
        let mut buf = [0; 1024];
        let (amt, src) = socket.recv_from(&mut buf)?;

        // отправляем ответ
        let buf = &mut buf[..amt];
        buf.reverse();
        socket.send_to(buf, &src)?;
    } // сокет закрывается здесь
    Ok(())
}

Адресация и преобразование имен

Модуль std::net предоставляет механизмы для преобразования между объектами SocketAddr и строками, представляющими адреса или имена хостов.

Функция ToSocketAddrs предоставляет способ преобразования строк в SocketAddr, который является обобщенным для всех методов, которым нужна привязка или подключение к адресу.

Некоторые примеры допустимых форм адресов:

  • "localhost:1234"
  • "127.0.0.1:8080"
  • "127.0.0.1" (если указан порт по умолчанию)
  • "[::1]:443"
  • "example.org:8080"
  • "example.org" (если указан порт по умолчанию)

Порт по умолчанию зависит от контекста. Например, для TcpStream::connect порт по умолчанию - 80, для TcpListener::bind - 0.

Функция ToSocketAddrs также реализована для SocketAddr и (IpAddr, u16), что позволяет явно передавать эти типы во все методы, принимающие ToSocketAddrs.

Преобразование имен хостов в адреса может блокировать текущий поток. Для асинхронного разрешения имен используйте крейт tokio или async-std (сейчас актуально библиотека smol).

Структуры

  • AddrParseError - ошибка, которая может быть возвращена при анализе адреса IP или сокета
  • Incoming - итератор, который бесконечно accept подключения на TcpListener
  • IntoIncoming - итератор, который бесконечно принимает соединения на TcpListener. Эта структура создается методом TcpListener::into_incoming.
  • Ipv4Addr - адрес IPv4
  • Ipv6Addr - адрес IPv6
  • SocketAddrV4 - адрес интернет-сокета IPv4
  • SocketAddrV6 - адрес интернет-сокета IPv6
  • TcpListener - структура, представляющая TCP-сервер, прослушивающий подключения
  • TcpStream - TCP-поток между локальным и удаленным сокетом
  • UdpSocket - UDP-сокет

Перечисления

  • IpAddr - адрес IP, версия 4 или версия 6
  • Shutdown - флаги для отключения частей соединения
  • SocketAddr - адрес интернет-сокета, IPv4 или IPv6
  • Ipv6MulticastScope - область многоадресной рассылки IPv6

Типажи

  • ToSocketAddrs - типаж для объектов, которые могут быть преобразованы в SocketAddr