Структура Named Pipe Server
pub struct NamedPipeServer { /* private fields */ }
net.Сервер именованного канала Windows.
Для приёма подключений клиентов необходимо создать сервер с помощью ServerOptions::create и дождаться подключения клиентов с помощью NamedPipeServer::connect.
Чтобы клиенты не сталкивались время от времени с ошибкой std::io::ErrorKind::NotFound при подключении к серверу, необходимо обеспечить постоянную доступность хотя бы одного экземпляра сервера. Это означает, что типичный цикл ожидания подключений на сервере несколько сложнее, поскольку нужно следить за тем, чтобы случайно не завершить работу сервера, пока к нему может подключиться клиент.
Правильно реализованный сервер выглядит так:
use std::io;
use tokio::net::windows::named_pipe::ServerOptions;
const PIPE_NAME: &str = r"\\.\pipe\named-pipe-idiomatic-server";
// The first server needs to be constructed early so that clients can
// be correctly connected. Otherwise calling .wait will cause the client to
// error.
//
// Here we also make use of `first_pipe_instance`, which will ensure that
// there are no other servers up and running already.
let mut server = ServerOptions::new()
.first_pipe_instance(true)
.create(PIPE_NAME)?;
// Spawn the server loop.
let server = tokio::spawn(async move {
loop {
// Wait for a client to connect.
server.connect().await?;
let connected_client = server;
// Construct the next server to be connected before sending the one
// we already have of onto a task. This ensures that the server
// isn't closed (after it's done in the task) before a new one is
// available. Otherwise the client might error with
// `io::ErrorKind::NotFound`.
server = ServerOptions::new().create(PIPE_NAME)?;
let client = tokio::spawn(async move {
/* use the connected client */
});
}
Ok::<_, io::Error>(())
});
/* do something else not server related here */Реализации
impl NamedPipeServer
pub unsafe fn from_raw_handle(handle: RawHandle) -> Result<Self>
Создаёт новый сервер именованного канала из указанного необработанного дескриптора.
Эта функция передаёт владение указанным дескриптором и возлагает ответственность за его закрытие на возвращаемый объект.
Эта функция также является небезопасной, поскольку возвращаемые сейчас примитивы предполагают, что они являются единственными владельцами оборачиваемого ими файлового дескриптора. Использование этой функции может случайно привести к нарушению данного условия, что может вызвать небезопасное обращение с памятью в коде, который полагается на его соблюдение.
Ошибки
Функция возвращает ошибку, если её вызвать вне среды выполнения Tokio, в среде выполнения, в которой не включён ввод-вывод, или если возникнут ошибки ввода-вывода, специфичные для операционной системы.
pub fn info(&self) -> Result<PipeInfo>
Получает сведения об именованном канале, с которым связан сервер.
use tokio::net::windows::named_pipe::{PipeEnd, PipeMode, ServerOptions};
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-info";
let server = ServerOptions::new()
.pipe_mode(PipeMode::Message)
.max_instances(5)
.create(PIPE_NAME)?;
let server_info = server.info()?;
assert_eq!(server_info.end, PipeEnd::Server);
assert_eq!(server_info.mode, PipeMode::Message);
assert_eq!(server_info.max_instances, 5);pub async fn connect(&self) -> Result<()>
Позволяет процессу сервера именованного канала ожидать подключения клиентского процесса к экземпляру именованного канала. Клиентский процесс подключается, создавая именованный канал с тем же именем.
Это соответствует системному вызову ConnectNamedPipe.
Безопасность при отмене
Этот метод безопасен при отмене. Если он используется в качестве ветви в select! и первой завершается другая ветвь, события подключения не теряются.
Пример
use tokio::net::windows::named_pipe::ServerOptions;
const PIPE_NAME: &str = r"\\.\pipe\mynamedpipe";
let pipe = ServerOptions::new().create(PIPE_NAME)?;
// Wait for a client to connect.
pipe.connect().await?;
// Use the connected client...pub fn disconnect(&self) -> Result<()>
Отключает серверную сторону экземпляра именованного канала от клиентского процесса.
use tokio::io::AsyncWriteExt;
use tokio::net::windows::named_pipe::{ClientOptions, ServerOptions};
use windows_sys::Win32::Foundation::ERROR_PIPE_NOT_CONNECTED;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-disconnect";
let server = ServerOptions::new()
.create(PIPE_NAME)?;
let mut client = ClientOptions::new()
.open(PIPE_NAME)?;
// Wait for a client to become connected.
server.connect().await?;
// Forcibly disconnect the client.
server.disconnect()?;
// Write fails with an OS-specific error after client has been
// disconnected.
let e = client.write(b"ping").await.unwrap_err();
assert_eq!(e.raw_os_error(), Some(ERROR_PIPE_NOT_CONNECTED as i32));pub async fn ready(&self, interest: Interest) -> Result<Ready>
Ожидает наступления любого из запрошенных состояний готовности.
Эта функция обычно используется вместе с try_read() или try_write(). Она позволяет одновременно читать из канала и записывать в него в одной задаче, не разделяя канал.
Функция может завершиться, даже если канал не готов. Это ложноположительный результат, и попытка выполнить операцию приведёт к io::ErrorKind::WouldBlock. Функция также может вернуть пустой набор Ready, поэтому всегда проверяйте возвращённое значение и при необходимости ожидайте снова, если запрошенные состояния не установлены.
Примеры
Одновременное чтение из канала и запись в него в одной задаче без разделения.
use tokio::io::Interest;
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-ready";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
loop {
let ready = server.ready(Interest::READABLE | Interest::WRITABLE).await?;
if ready.is_readable() {
let mut data = vec![0; 1024];
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_read(&mut data) {
Ok(n) => {
println!("read {} bytes", n);
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
if ready.is_writable() {
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_write(b"hello world") {
Ok(n) => {
println!("write {} bytes", n);
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
}
}pub async fn readable(&self) -> Result<()>
Ожидает, пока канал станет доступен для чтения.
Эта функция эквивалентна ready(Interest::READABLE) и обычно используется вместе с try_read().
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-readable";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
let mut msg = vec![0; 1024];
loop {
// Wait for the pipe to be readable
server.readable().await?;
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_read(&mut msg) {
Ok(n) => {
msg.truncate(n);
break;
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
println!("GOT = {:?}", msg);
Ok(())
}pub fn poll_read_ready(&self, cx: &mut Context<'_>) -> Poll<Result<()>>
Проверяет готовность к чтению.
Если канал в данный момент не готов к чтению, этот метод сохранит копию Waker из предоставленного Context. Когда канал будет готов к чтению, для waker будет вызван Waker::wake.
Обратите внимание: при нескольких вызовах poll_read_ready или poll_read пробуждение получит только Waker из Context, переданного при последнем вызове. (Однако poll_write_ready хранит второй, независимый waker.)
Эта функция предназначена для случаев, когда создать future и закрепить её с помощью readable невозможно. Если возможно, предпочтительно использовать readable, поскольку это позволяет нескольким задачам одновременно выполнять опрос.
Возвращаемое значение
Функция возвращает:
-
Poll::Pending, если канал не готов к чтению. -
Poll::Ready(Ok(())), если канал готов к чтению. -
Poll::Ready(Err(e)), если произошла ошибка.
Ошибки
Эта функция может вызвать любую стандартную ошибку ввода-вывода, кроме WouldBlock.
pub fn try_read(&self, buf: &mut [u8]) -> Result<usize>
Пытается прочитать данные из канала в предоставленный буфер и возвращает количество прочитанных байтов.
Получает все ожидающие данные из канала, но не ждёт поступления новых данных. В случае успеха возвращает количество прочитанных байтов. Поскольку try_read() работает в неблокирующем режиме, асинхронной задаче не требуется хранить буфер — он может целиком находиться в стеке.
Обычно эта функция используется вместе с readable() или ready().
Возвращаемое значение
Если данные успешно прочитаны, возвращается Ok(n), где n — количество прочитанных байтов. Если n равно 0, это может означать один из двух случаев:
- Читающая половина канала закрыта и больше не будет выдавать данные.
- Длина указанного буфера равна 0 байт.
Если канал не готов к чтению данных, возвращается Err(io::ErrorKind::WouldBlock).
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-try-read";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
server.readable().await?;
// Creating the buffer **after** the `await` prevents it from
// being stored in the async task.
let mut buf = [0; 4096];
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_read(&mut buf) {
Ok(0) => break,
Ok(n) => {
println!("read {} bytes", n);
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub fn try_read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
Пытается прочитать данные из канала в предоставленные буферы и возвращает количество прочитанных байтов.
Данные копируются в буферы по порядку; последний заполняемый буфер может быть заполнен лишь частично. Этот метод эквивалентен одному вызову try_read() с объединёнными буферами.
Получает все ожидающие данные из канала, но не ждёт поступления новых данных. В случае успеха возвращает количество прочитанных байтов. Поскольку try_read_vectored() работает в неблокирующем режиме, асинхронной задаче не требуется хранить буфер — он может целиком находиться в стеке.
Обычно эта функция используется вместе с readable() или ready().
Возвращаемое значение
Если данные успешно прочитаны, возвращается Ok(n), где n — количество прочитанных байтов. Ok(0) означает, что читающая половина канала закрыта и больше не будет выдавать данные. Если канал не готов к чтению данных, возвращается Err(io::ErrorKind::WouldBlock).
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io::{self, IoSliceMut};
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-try-read-vectored";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
server.readable().await?;
// Creating the buffer **after** the `await` prevents it from
// being stored in the async task.
let mut buf_a = [0; 512];
let mut buf_b = [0; 1024];
let mut bufs = [
IoSliceMut::new(&mut buf_a),
IoSliceMut::new(&mut buf_b),
];
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_read_vectored(&mut bufs) {
Ok(0) => break,
Ok(n) => {
println!("read {} bytes", n);
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub fn try_read_buf<B: BufMut>(&self, buf: &mut B) -> Result<usize>
io-util.Пытается прочитать данные из потока в предоставленный буфер, продвигая внутренний курсор буфера, и возвращает количество прочитанных байтов.
Получает все ожидающие данные из канала, но не ждёт поступления новых данных. В случае успеха возвращает количество прочитанных байтов. Поскольку try_read_buf() работает в неблокирующем режиме, буфер не нужно хранить в асинхронной задаче — он может целиком размещаться в стеке.
Обычно эта функция используется вместе с readable() или ready().
Возвращаемое значение
Если данные успешно прочитаны, возвращается Ok(n), где n — количество прочитанных байтов. Ok(0) указывает, что читающая половина потока закрыта и больше не будет предоставлять данные. Если поток не готов к чтению данных, возвращается Err(io::ErrorKind::WouldBlock).
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-client-readable";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new().create(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
server.readable().await?;
let mut buf = Vec::with_capacity(4096);
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_read_buf(&mut buf) {
Ok(0) => break,
Ok(n) => {
println!("read {} bytes", n);
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub async fn writable(&self) -> Result<()>
Ожидает, пока канал не станет доступен для записи.
Эта функция эквивалентна ready(Interest::WRITABLE) и обычно используется вместе с try_write().
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-writable";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
loop {
// Wait for the pipe to be writable
server.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_write(b"hello world") {
Ok(n) => {
break;
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub fn poll_write_ready(&self, cx: &mut Context<'_>) -> Poll<Result<()>>
Проверяет готовность к записи.
Если канал в данный момент не готов к записи, этот метод сохранит клон объекта Waker из предоставленного Context. Когда канал будет готов к записи, для объекта пробуждения будет вызван Waker::wake.
Обратите внимание: при нескольких вызовах poll_write_ready или poll_write для получения сигнала пробуждения будет запланирован только объект Waker из Context, переданный при последнем вызове. (Однако poll_read_ready хранит второй, независимый объект пробуждения.)
Эта функция предназначена для случаев, когда невозможно создать и закрепить future с помощью writable. Если возможно, предпочтительно использовать writable, поскольку это позволяет нескольким задачам одновременно выполнять опрос.
Возвращаемое значение
Функция возвращает:
-
Poll::Pending, если канал не готов к записи. -
Poll::Ready(Ok(())), если канал готов к записи. -
Poll::Ready(Err(e)), если произошла ошибка.
Ошибки
Эта функция может столкнуться с любой стандартной ошибкой ввода-вывода, кроме WouldBlock.
pub fn try_write(&self, buf: &[u8]) -> Result<usize>
Пытается записать буфер в канал и возвращает количество записанных байтов.
Функция попытается записать всё содержимое buf, но может быть записана только часть буфера.
Эта функция обычно используется вместе с writable().
Возвращаемое значение
Если данные успешно записаны, возвращается Ok(n), где n — количество записанных байтов. Если канал не готов к записи данных, возвращается Err(io::ErrorKind::WouldBlock).
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-try-write";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
loop {
// Wait for the pipe to be writable
server.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_write(b"hello world") {
Ok(n) => {
break;
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub fn try_write_vectored(&self, buf: &[IoSlice<'_>]) -> Result<usize>
Пытается записать в канал несколько буферов и возвращает количество записанных байтов.
Данные записываются из каждого буфера по порядку; при этом последний буфер, из которого выполняется чтение, может быть обработан лишь частично. Этот метод эквивалентен одному вызову try_write() с объединёнными буферами.
Эта функция обычно используется вместе с writable().
Возвращаемое значение
Если данные успешно записаны, возвращается Ok(n), где n — количество записанных байтов. Если канал не готов к записи данных, возвращается Err(io::ErrorKind::WouldBlock).
Примеры
use tokio::net::windows::named_pipe;
use std::error::Error;
use std::io;
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-server-try-write-vectored";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let server = named_pipe::ServerOptions::new()
.create(PIPE_NAME)?;
let bufs = [io::IoSlice::new(b"hello "), io::IoSlice::new(b"world")];
loop {
// Wait for the pipe to be writable
server.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match server.try_write_vectored(&bufs) {
Ok(n) => {
break;
}
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
}
Ok(())
}pub fn try_io<R>( &self, interest: Interest, f: impl FnOnce() -> Result<R>, ) -> Result<R>
Пытается выполнить чтение из канала или запись в него с помощью предоставленной пользователем операции ввода-вывода.
Если канал готов, вызывается предоставленное замыкание. Замыкание должно попытаться выполнить операцию ввода-вывода с каналом, вручную вызвав соответствующий системный вызов. Если операция завершается ошибкой, поскольку канал фактически не готов, замыкание должно вернуть ошибку WouldBlock, а флаг готовности будет сброшен. Затем возвращается значение, полученное от замыкания, посредством try_io.
Если канал не готов, замыкание не вызывается, а возвращается ошибка WouldBlock.
Замыкание должно возвращать ошибку WouldBlock только в том случае, если оно выполнило операцию ввода-вывода с каналом, завершившуюся ошибкой из-за неготовности канала. Возврат ошибки WouldBlock в любой другой ситуации приведёт к неправильному сбросу флага готовности, что может нарушить работу канала.
Замыкание не должно выполнять операцию ввода-вывода с помощью каких-либо методов, определённых для типа Tokio NamedPipeServer, поскольку это нарушит работу флага готовности и может привести к неправильной работе канала.
Этот метод не предназначен для использования с объединёнными интересами. Замыкание должно выполнять только один тип операции ввода-вывода, поэтому ему не должно требоваться более одного состояния готовности. При вызове с объединённым интересом этот метод может вызвать панику или ожидать бесконечно.
Обычно вместе с этой функцией используется readable(), writable() или ready().
pub async fn async_io<R>( &self, interest: Interest, f: impl FnMut() -> Result<R>, ) -> Result<R>
Выполняет чтение из канала или запись в него с помощью предоставленной пользователем операции ввода-вывода.
Ожидается готовность канала, и когда канал готов, вызывается предоставленное замыкание. Замыкание должно попытаться выполнить операцию ввода-вывода с каналом, вручную вызвав соответствующий системный вызов. Если операция завершается ошибкой, поскольку канал фактически не готов, замыкание должно вернуть ошибку WouldBlock. В этом случае флаг готовности сбрасывается, и готовность канала ожидается снова. Этот цикл повторяется, пока замыкание не вернёт Ok или ошибку, отличную от WouldBlock.
Замыкание должно возвращать ошибку WouldBlock только в том случае, если оно выполнило операцию ввода-вывода с каналом, завершившуюся ошибкой из-за неготовности канала. Возврат ошибки WouldBlock в любой другой ситуации приведёт к неправильному сбросу флага готовности, что может нарушить работу канала.
Замыкание не должно выполнять операцию ввода-вывода с помощью каких-либо методов, определённых для типа Tokio NamedPipeServer, поскольку это нарушит работу флага готовности и может привести к неправильной работе канала.
Этот метод не предназначен для использования с объединёнными интересами. Замыкание должно выполнять только один тип операции ввода-вывода, поэтому ему не должно требоваться более одного состояния готовности. При вызове с объединённым интересом этот метод может вызвать панику или ожидать бесконечно.
Реализации трейтов
impl AsHandle for NamedPipeServer
fn as_handle(&self) -> BorrowedHandle<'_>
docsrs и Unix и (функции crate fs или net).impl AsRawHandle for NamedPipeServer
fn as_raw_handle(&self) -> RawHandle
docsrs и Unix и (функции crate fs или net).impl AsyncWrite for NamedPipeServer
fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll<Result<usize>>
buf в объект. Подробнее
fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll<Result<usize>>
poll_write, но запись выполняется из среза буферов. Подробнее
fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<()>>
fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>>
fn is_write_vectored(&self) -> bool
poll_write_vectored. Подробнее
Автоматические реализации трейтов
impl Freeze for NamedPipeServer
impl RefUnwindSafe for NamedPipeServer
impl Send for NamedPipeServer
impl Sync for NamedPipeServer
impl Unpin for NamedPipeServer
impl UnsafeUnpin for NamedPipeServer
impl UnwindSafe for NamedPipeServer
Общие реализации
impl<R> AsyncReadExt for R
fn chain<R>(self, next: R) -> Chain<Self, R>
io-util.fn read<'a>(&'a mut self, buf: &'a mut [u8]) -> Read<'a, Self>where Self: Unpin,
io-util.fn read_buf<'a, B>(&'a mut self, buf: &'a mut B) -> ReadBuf<'a, Self, B>
io-util.fn read_exact<'a>(&'a mut self, buf: &'a mut [u8]) -> ReadExact<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
fn read_u8(&mut self) -> ReadU8<&mut Self>where Self: Unpin,
io-util.fn read_i8(&mut self) -> ReadI8<&mut Self>where Self: Unpin,
io-util.fn read_u32(&mut self) -> ReadU32<&mut Self>where Self: Unpin,
io-util.fn read_i32(&mut self) -> ReadI32<&mut Self>where Self: Unpin,
io-util.fn read_u64(&mut self) -> ReadU64<&mut Self>where Self: Unpin,
io-util.fn read_i64(&mut self) -> ReadI64<&mut Self>where Self: Unpin,
io-util.fn read_u128(&mut self) -> ReadU128<&mut Self>where Self: Unpin,
io-util.fn read_i128(&mut self) -> ReadI128<&mut Self>where Self: Unpin,
io-util.fn read_f32(&mut self) -> ReadF32<&mut Self>where Self: Unpin,
io-util.fn read_f64(&mut self) -> ReadF64<&mut Self>where Self: Unpin,
io-util.fn read_u16_le(&mut self) -> ReadU16Le<&mut Self>where Self: Unpin,
io-util.fn read_i16_le(&mut self) -> ReadI16Le<&mut Self>where Self: Unpin,
io-util.fn read_u32_le(&mut self) -> ReadU32Le<&mut Self>where Self: Unpin,
io-util.fn read_i32_le(&mut self) -> ReadI32Le<&mut Self>where Self: Unpin,
io-util.fn read_u64_le(&mut self) -> ReadU64Le<&mut Self>where Self: Unpin,
io-util.fn read_i64_le(&mut self) -> ReadI64Le<&mut Self>where Self: Unpin,
io-util.fn read_u128_le(&mut self) -> ReadU128Le<&mut Self>where Self: Unpin,
io-util.fn read_i128_le(&mut self) -> ReadI128Le<&mut Self>where Self: Unpin,
io-util.fn read_f32_le(&mut self) -> ReadF32Le<&mut Self>where Self: Unpin,
io-util.fn read_f64_le(&mut self) -> ReadF64Le<&mut Self>where Self: Unpin,
io-util.fn read_to_end<'a>(&'a mut self, buf: &'a mut Vec<u8>) -> ReadToEnd<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
fn read_to_string<'a>( &'a mut self, dst: &'a mut String, ) -> ReadToString<'a, Self>where Self: Unpin,
io-util.buf. Подробнее
impl<W> AsyncWriteExt for Wwhere W: AsyncWrite + ?Sized,
fn write<'a>(&'a mut self, src: &'a [u8]) -> Write<'a, Self>where Self: Unpin,
io-util.fn write_vectored<'a, 'b>( &'a mut self, bufs: &'a [IoSlice<'b>], ) -> WriteVectored<'a, 'b, Self>where Self: Unpin,
io-util.fn write_buf<'a, B>(&'a mut self, src: &'a mut B) -> WriteBuf<'a, Self, B>
io-util.fn write_all_buf<'a, B>( &'a mut self, src: &'a mut B, ) -> WriteAllBuf<'a, Self, B>
io-util.fn write_all<'a>(&'a mut self, src: &'a [u8]) -> WriteAll<'a, Self>where Self: Unpin,
io-util.fn write_u16(&mut self, n: u16) -> WriteU16<&mut Self>where Self: Unpin,
io-util.fn write_i16(&mut self, n: i16) -> WriteI16<&mut Self>where Self: Unpin,
io-util.fn write_u32(&mut self, n: u32) -> WriteU32<&mut Self>where Self: Unpin,
io-util.fn write_i32(&mut self, n: i32) -> WriteI32<&mut Self>where Self: Unpin,
io-util.fn write_u64(&mut self, n: u64) -> WriteU64<&mut Self>where Self: Unpin,
io-util.fn write_i64(&mut self, n: i64) -> WriteI64<&mut Self>where Self: Unpin,
io-util.fn write_u128(&mut self, n: u128) -> WriteU128<&mut Self>where Self: Unpin,
io-util.fn write_i128(&mut self, n: i128) -> WriteI128<&mut Self>where Self: Unpin,
io-util.fn write_f32(&mut self, n: f32) -> WriteF32<&mut Self>where Self: Unpin,
io-util.fn write_f64(&mut self, n: f64) -> WriteF64<&mut Self>where Self: Unpin,
io-util.fn write_u16_le(&mut self, n: u16) -> WriteU16Le<&mut Self>where Self: Unpin,
io-util.fn write_i16_le(&mut self, n: i16) -> WriteI16Le<&mut Self>where Self: Unpin,
io-util.fn write_u32_le(&mut self, n: u32) -> WriteU32Le<&mut Self>where Self: Unpin,
io-util.fn write_i32_le(&mut self, n: i32) -> WriteI32Le<&mut Self>where Self: Unpin,
io-util.fn write_u64_le(&mut self, n: u64) -> WriteU64Le<&mut Self>where Self: Unpin,
io-util.fn write_i64_le(&mut self, n: i64) -> WriteI64Le<&mut Self>where Self: Unpin,
io-util.fn write_u128_le(&mut self, n: u128) -> WriteU128Le<&mut Self>where Self: Unpin,
io-util.fn write_i128_le(&mut self, n: i128) -> WriteI128Le<&mut Self>where Self: Unpin,
io-util.fn write_f32_le(&mut self, n: f32) -> WriteF32Le<&mut Self>where Self: Unpin,
io-util.fn write_f64_le(&mut self, n: f64) -> WriteF64Le<&mut Self>where Self: Unpin,
io-util.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/windows/named_pipe/struct.NamedPipeServer.html