Структура TcpListener
#![allow(unused)] fn main() { pub struct TcpListener(_); }
TCP-сервер, прослушивающий подключения.
После создания TcpListener путем привязки к адресу сокета, он прослушивает входящие TCP-подключения. Эти подключения могут быть приняты путем вызова accept или через итерацию по incoming, возвращающему итератор.
Сокет будет закрыт, когда структура выйдет из области видимости.
Трансмиссия Control Protocol определяется в IETF RFC 793.
NOTE: Эта структура доступна в crate std для платформ wasm32-unknown-unknown, начиная с Rust 1.39.0, но в настоящее время она поддерживает только клиентские сокеты и не поддерживает серверные сокеты.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { println!("новое подключение: {}", stream.peer_addr().unwrap()); } Err(e) => { println!("ошибка подключения: {}", e); } } } }
Методы
bind
#![allow(unused)] fn main() { pub fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener> }
Создает новый TcpListener, который будет привязан к указанному адресу.
Возвращаемый TcpListener готов для принятия подключений.
Адрес типа A может быть любым типом, реализующим ToSocketAddrs. Смотрите его документацию для примеров.
Если addr дает несколько адресов, bind попытается привязаться к каждому из них, пока один не сработает. Если ни один из адресов не работает, возвращается ошибка от последней попытки.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); }
local_addr
#![allow(unused)] fn main() { pub fn local_addr(&self) -> Result<SocketAddr> }
Возвращает локальный адрес сокета этого слушателя.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); println!("адрес: {:?}", listener.local_addr().unwrap()); }
try_clone
#![allow(unused)] fn main() { pub fn try_clone(&self) -> Result<TcpListener> }
Создает новый независимо владеемый дескриптор того же нижележащего сокета.
Возвращенный TcpListener является ссылкой на тот же сокет, что и этот объект. Оба дескриптора могут использоваться для принятия подключений, и они будут обрабатывать разные подключения.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); let listener_clone = listener.try_clone().unwrap(); }
accept
#![allow(unused)] fn main() { pub fn accept(&self) -> Result<(TcpStream, SocketAddr)> }
Принимает новое входящее подключение из этого слушателя.
Эта функция будет блокировать вызывающий поток, пока не будет установлено новое подключение. Когда установлено подключение, соответствующее TcpStream и удаленный адрес будут возвращены.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); match listener.accept() { Ok((_socket, addr)) => println!("новое подключение: {}", addr), Err(e) => println!("не удалось принять подключение: {}", e), } }
incoming
#![allow(unused)] fn main() { pub fn incoming(&self) -> Incoming<'_> }
Возвращает итератор по подключениям, принимаемым этим слушателем.
Итератор никогда не возвращает None и также не содержит ошибок ввода-вывода. Вместо этого ошибки ввода-вывода могут быть получены при вызове next итератора.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); for stream in listener.incoming() { match stream { Ok(stream) => { println!("новое подключение: {}", stream.peer_addr().unwrap()); } Err(e) => { println!("ошибка подключения: {}", e); } } } }
set_ttl
#![allow(unused)] fn main() { pub fn set_ttl(&self, ttl: u32) -> Result<()> }
Устанавливает значение параметра IP_TTL для этого сокета.
Этот параметр устанавливает время жизни (Time-To-Live) для пакетов, отправленных из этого сокета.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_ttl(100).expect("не удалось установить TTL"); }
ttl
#![allow(unused)] fn main() { pub fn ttl(&self) -> Result<u32> }
Получает значение параметра IP_TTL для этого сокета.
Для получения дополнительной информации смотрите set_ttl.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_ttl(100).expect("не удалось установить TTL"); assert_eq!(listener.ttl().unwrap_or(0), 100); }
set_only_v6
#![allow(unused)] fn main() { pub fn set_only_v6(&self, only_v6: bool) -> Result<()> }
Устанавливает значение IPV6_V6ONLY для этого сокета.
Если это значение true, то сокет может быть привязан только к IPv6-адресам, и IPv4-подключения не будут приниматься сокетом, привязанным к IPv6-адресу.
Если это значение false, то сокет может быть привязан к IPv6-адресам, и IPv4-подключения будут приняты через IPv4-отображение на IPv6.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_only_v6(false).expect("не удалось установить only_v6"); }
only_v6
#![allow(unused)] fn main() { pub fn only_v6(&self) -> Result<bool> }
Получает значение параметра IPV6_V6ONLY для этого сокета.
Для получения дополнительной информации смотрите set_only_v6.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_only_v6(false).expect("не удалось установить only_v6"); assert_eq!(listener.only_v6().unwrap_or(true), false); }
take_error
#![allow(unused)] fn main() { pub fn take_error(&self) -> Result<Option<Error>> }
Получает значение параметра сокета SO_ERROR.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); if let Ok(Some(error)) = listener.take_error() { println!("ошибка сокета: {}", error); } }
set_nonblocking
#![allow(unused)] fn main() { pub fn set_nonblocking(&self, nonblocking: bool) -> Result<()> }
Переводит сокет в неблокирующий режим.
Если nonblocking равно true, то операции над сокетом, которые блокировали бы, будут возвращать ошибки вместо блокировки. Если nonblocking равно false, то сокет будет работать в блокирующем режиме.
Примеры
#![allow(unused)] fn main() { use std::net::TcpListener; use std::thread; use std::io; let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); listener.set_nonblocking(true).expect("не удалось установить неблокирующий режим"); thread::spawn(move || { for stream in listener.incoming() { match stream { Ok(s) => { // обрабатываем поток } Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { // ждем, пока сокет станет готовым thread::sleep(std::time::Duration::from_millis(100)); continue; } Err(e) => panic!("неожиданная ошибка ввода-вывода: {}", e), } } }); }
Трайт-реализации
AsFd
#![allow(unused)] fn main() { impl AsFd for TcpListener }
Используется операционной системой для представления низкоуровневого дескриптора файла.
AsRawFd
#![allow(unused)] fn main() { impl AsRawFd for TcpListener }
Представляет необработанный дескриптор файла.
From<TcpListener>
#![allow(unused)] fn main() { impl From<TcpListener> for Arc<TcpListener> }
Преобразует TcpListener в Arc<TcpListener>.
From<TcpListener>
#![allow(unused)] fn main() { impl From<TcpListener> for Socket }
Преобразует TcpListener в Socket.
IntoRawFd
#![allow(unused)] fn main() { impl IntoRawFd for TcpListener }
Потребляет этот объект, возвращая необработанный дескриптор файла.
Debug
#![allow(unused)] fn main() { impl Debug for TcpListener }
Реализует отладочное отображение для TcpListener.
Связанные функции
socket2
#![allow(unused)] fn main() { impl TcpListener }
Расширенные операции, доступные при включении функции net в крейте socket2.
Примечания
- Сокет автоматически закрывается при выходе из области видимости
- Все методы блокирующие, если не установлен неблокирующий режим
- Для асинхронных операций используйте крейты
async-stdилиtokio