Структура TcpListener
pub struct TcpListener { /* private fields */ }
net.TCP-сокет-сервер, ожидающий подключений.
Принять новое подключение можно с помощью метода accept.
TcpListener можно преобразовать в Stream с помощью TcpListenerStream.
Сокет будет закрыт при удалении значения.
Ошибки
Обратите внимание, что при принятии подключения могут возникать различные ошибки, и не все из них обязательно являются фатальными — например, слишком большое количество открытых файловых дескрипторов или закрытие подключения другой стороной, пока оно ожидает в очереди на принятие. Если такие ошибки никак не обрабатывать, они приведут к завершению потока.
Примеры
Использование accept:
use tokio::net::TcpListener;
use std::io;
async fn process_socket<T>(socket: T) {
// do work with socket here
}
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (socket, _) = listener.accept().await?;
process_socket(socket).await;
}
}Реализации
impl TcpListener
pub async fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener>
Создает новый TcpListener, который будет привязан к указанному адресу.
Возвращенный слушатель готов принимать соединения.
При привязке к порту с номером 0 операционная система назначит этому слушателю порт. Выделенный порт можно узнать с помощью метода local_addr.
Тип адреса может быть любым типом, реализующим трейт ToSocketAddrs. Если addr возвращает несколько адресов, привязка будет выполняться для каждого из них, пока одна из попыток не завершится успешно и не вернет слушатель. Если ни для одного из адресов не удастся создать слушатель, будет возвращена ошибка последней попытки (для последнего адреса).
Эта функция устанавливает для сокета параметр SO_REUSEADDR в Unix.
Чтобы настроить сокет до привязки, можно использовать тип TcpSocket.
Примеры
use tokio::net::TcpListener;
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:2345").await?;
// use the listener
Ok(())
}pub async fn accept(&self) -> Result<(TcpStream, SocketAddr)>
Принимает новое входящее соединение от этого слушателя.
Эта функция приостановится, пока не будет установлено новое TCP-соединение. После установления соединения будут возвращены соответствующий TcpStream и адрес удаленного узла.
Безопасность при отмене
Этот метод безопасен при отмене. Если метод используется в качестве ветви в tokio::select! и первой завершается другая ветвь, гарантируется, что этот метод не принял новых соединений.
Примеры
use tokio::net::TcpListener;
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
match listener.accept().await {
Ok((_socket, addr)) => println!("new client: {:?}", addr),
Err(e) => println!("couldn't get client: {:?}", e),
}
Ok(())
}pub fn poll_accept( &self, cx: &mut Context<'_>, ) -> Poll<Result<(TcpStream, SocketAddr)>>
Проверяет возможность принять новое входящее соединение этим слушателем.
Если соединения для принятия нет, возвращается Poll::Pending, а текущая задача будет уведомлена пробудителем. Обратите внимание: при нескольких вызовах poll_accept пробуждение будет запланировано только для Waker из Context, переданного при последнем вызове.
pub fn from_std(listener: TcpListener) -> Result<TcpListener>
Создает новый TcpListener из std::net::TcpListener.
Эта функция предназначена для оборачивания TCP-слушателя из стандартной библиотеки в эквивалентный тип Tokio.
Этот API обычно используется вместе с крейтом socket2 и типом Socket для создания и настройки слушателя перед передачей его базовому циклу обработки событий. Это позволяет настраивать такие параметры, как SO_REUSEPORT, привязывать слушатель к нескольким адресам и т. д.
Примечания
Вызывающий код отвечает за то, чтобы слушатель работал в неблокирующем режиме. В противном случае все операции ввода-вывода с этим слушателем будут блокировать поток, что приведет к неожиданному поведению. Неблокирующий режим можно установить с помощью set_nonblocking.
Передавать слушатель в блокирующем режиме недопустимо; в будущем поведение в таком случае может измениться. Например, может возникнуть паника.
Примеры
use std::error::Error;
use tokio::net::TcpListener;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let std_listener = std::net::TcpListener::bind("127.0.0.1:0")?;
std_listener.set_nonblocking(true)?;
let listener = TcpListener::from_std(std_listener)?;
Ok(())
}Паники
Эта функция вызывает панику, если ее вызвать вне среды выполнения с включенным вводом-выводом.
Среда выполнения обычно устанавливается неявно, когда эта функция вызывается из будущего, выполняемого средой выполнения Tokio; в противном случае ее можно установить явно с помощью функции Runtime::enter.
pub fn into_std(self) -> Result<TcpListener>
Преобразует tokio::net::TcpListener в std::net::TcpListener.
Возвращённый std::net::TcpListener будет по умолчанию переведён в неблокирующий режим: true. При необходимости используйте set_nonblocking, чтобы изменить режим блокировки.
Примеры
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let tokio_listener = tokio::net::TcpListener::bind("127.0.0.1:0").await?;
let std_listener = tokio_listener.into_std()?;
std_listener.set_nonblocking(false)?;
Ok(())
}pub fn local_addr(&self) -> Result<SocketAddr>
Возвращает локальный адрес, к которому привязан этот слушатель.
Это может быть полезно, например, при привязке к порту 0, чтобы определить, какой порт был назначен фактически.
Примеры
use tokio::net::TcpListener;
use std::io;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
assert_eq!(listener.local_addr()?,
SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));
Ok(())
}pub fn ttl(&self) -> Result<u32>
Получает значение параметра IP_TTL для этого сокета.
Дополнительную информацию об этом параметре см. в разделе set_ttl.
Примеры
use tokio::net::TcpListener;
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:0").await?;
listener.set_ttl(100).expect("could not set TTL");
assert_eq!(listener.ttl()?, 100);
Ok(())
}pub fn set_ttl(&self, ttl: u32) -> Result<()>
Устанавливает значение параметра IP_TTL для этого сокета.
Это значение задаёт поле времени жизни, используемое в каждом пакете, отправляемом из этого сокета.
Примеры
use tokio::net::TcpListener;
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:0").await?;
listener.set_ttl(100).expect("could not set TTL");
Ok(())
}Реализации трейтов
impl AsFd for TcpListener
fn as_fd(&self) -> BorrowedFd<'_>
impl AsRawFd for TcpListener
impl AsRawSocket for TcpListener
fn as_raw_socket(&self) -> RawSocket
docsrs и Unix и (функции crate fs или net).impl AsSocket for TcpListener
fn as_socket(&self) -> BorrowedSocket<'_>
docsrs и Unix и (функции crate fs или net).impl TryFrom<TcpListener> for TcpListener
fn try_from(stream: TcpListener) -> Result<Self, Self::Error>
Потребляет stream, возвращая объект ввода-вывода tokio.
Это эквивалентно TcpListener::from_std(stream).
Автоматические реализации трейтов
impl !Freeze for TcpListener
impl RefUnwindSafe for TcpListener
impl Send for TcpListener
impl Sync for TcpListener
impl Unpin for TcpListener
impl UnsafeUnpin for TcpListener
impl UnwindSafe for TcpListener
Обобщённые реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/net/struct.TcpListener.html