Модуль 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подключения наTcpListenerIntoIncoming- итератор, который бесконечно принимает соединения наTcpListener. Эта структура создается методомTcpListener::into_incoming.Ipv4Addr- адрес IPv4Ipv6Addr- адрес IPv6SocketAddrV4- адрес интернет-сокета IPv4SocketAddrV6- адрес интернет-сокета IPv6TcpListener- структура, представляющая TCP-сервер, прослушивающий подключенияTcpStream- TCP-поток между локальным и удаленным сокетомUdpSocket- UDP-сокет
Перечисления
IpAddr- адрес IP, версия 4 или версия 6Shutdown- флаги для отключения частей соединенияSocketAddr- адрес интернет-сокета, IPv4 или IPv6Ipv6MulticastScope- область многоадресной рассылки IPv6
Типажи
ToSocketAddrs- типаж для объектов, которые могут быть преобразованы вSocketAddr