Spec-Zone.ru › Tokio

Структура TcpListener

pub struct TcpListener { /* private fields */ }
Доступно только при включённой функции crate 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>

Доступно на not (WASI and WASIp1).

Создает новый 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

fn as_raw_fd(&self) -> RawFd

Извлекает необработанный файловый дескриптор. Подробнее

impl AsRawSocket for TcpListener

Доступно только в Windows.

fn as_raw_socket(&self) -> RawSocket

Доступно только в docsrs и Unix и (функции crate fs или net).
См. std::os::windows::io::AsRawSocket::as_raw_socket

impl AsSocket for TcpListener

Доступно только в Windows.

fn as_socket(&self) -> BorrowedSocket<'_>

Доступно только в docsrs и Unix и (функции crate fs или net).
См. std::os::windows::io::AsSocket::as_socket

impl Debug for TcpListener

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Форматирует значение с помощью указанного форматтера. Подробнее

impl TryFrom<TcpListener> for TcpListener

fn try_from(stream: TcpListener) -> Result<Self, Self::Error>

Потребляет stream, возвращая объект ввода-вывода tokio.

Это эквивалентно TcpListener::from_std(stream).

type Error = Error

Тип, возвращаемый в случае ошибки преобразования.

Автоматические реализации трейтов

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> Any for T
where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

Получает TypeId значения self. Подробнее

impl<T> Borrow<T> for T
where T: ?Sized,

fn borrow(&self) -> &T

Неизменяемо заимствует данные из принадлежащего значения. Подробнее

impl<T> BorrowMut<T> for T
where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

Изменяемо заимствует данные из принадлежащего значения. Подробнее

impl<T> From<T> for T

fn from(t: T) -> T

Возвращает аргумент без изменений.

impl<T> Instrument for T

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью предоставленного Span, возвращая оболочку Instrumented. Подробнее

fn in_current_span(self) -> Instrumented<Self> ⓘ

Инструментирует этот тип с помощью текущего Span, возвращая оболочку Instrumented. Подробнее

impl<T, U> Into<U> for T
where U: From<T>,

fn into(self) -> U

Вызывает U::from(self).

То есть результат этого преобразования определяется реализацией From<T> for U.

impl<T, U> TryFrom<U> for T
where U: Into<T>,

type Error = Infallible

Тип, возвращаемый в случае ошибки преобразования.

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Выполняет преобразование.

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error

Тип, возвращаемый в случае ошибки преобразования.

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Выполняет преобразование.

impl<T> WithSubscriber for T

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Присоединяет предоставленный Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API