Структура Named Pipe Client
pub struct NamedPipeClient { /* private fields */ }
net.Клиент для именованного канала Windows.
Создаётся с помощью ClientOptions::open.
Для правильного подключения клиента необходимо выполнить несколько шагов. При подключении через ClientOptions::open может возникнуть ошибка, указывающая на одну из двух ситуаций:
-
std::io::ErrorKind::NotFound— сервер недоступен. -
ERROR_PIPE_BUSY— сервер доступен, но занят. Подождите немного и попробуйте снова.
Таким образом, правильно реализованный клиент выглядит так:
use std::time::Duration;
use tokio::net::windows::named_pipe::ClientOptions;
use tokio::time;
use windows_sys::Win32::Foundation::ERROR_PIPE_BUSY;
const PIPE_NAME: &str = r"\\.\pipe\named-pipe-idiomatic-client";
let client = loop {
match ClientOptions::new().open(PIPE_NAME) {
Ok(client) => break client,
Err(e) if e.raw_os_error() == Some(ERROR_PIPE_BUSY as i32) => (),
Err(e) => return Err(e),
}
time::sleep(Duration::from_millis(50)).await;
};
/* use the connected client */Реализации
impl NamedPipeClient
pub unsafe fn from_raw_handle(handle: RawHandle) -> Result<Self>
Создаёт новый клиент именованного канала из указанного необработанного дескриптора.
Эта функция передаёт владение указанным дескриптором и возлагает ответственность за его закрытие на возвращаемый объект.
Эта функция также является небезопасной, поскольку возвращаемые в настоящее время примитивы имеют контракт, согласно которому они являются единственными владельцами оборачиваемого ими файлового дескриптора. Использование этой функции может случайно привести к нарушению данного контракта, что может вызвать небезопасное поведение в коде, полагающемся на его соблюдение.
Ошибки
Функция завершится ошибкой, если вызвать её вне среды выполнения Tokio, в среде выполнения, где не включён ввод-вывод, или если произойдёт какая-либо ошибка ввода-вывода, специфичная для ОС.
pub fn info(&self) -> Result<PipeInfo>
Получает сведения об именованном канале, с которым связан клиент.
use tokio::net::windows::named_pipe::{ClientOptions, PipeEnd, PipeMode};
const PIPE_NAME: &str = r"\\.\pipe\tokio-named-pipe-client-info";
let client = ClientOptions::new()
.open(PIPE_NAME)?;
let client_info = client.info()?;
assert_eq!(client_info.end, PipeEnd::Client);
assert_eq!(client_info.mode, PipeMode::Message);
assert_eq!(client_info.max_instances, 5);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-client-ready";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
let ready = client.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 client.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 client.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-client-readable";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
let mut msg = vec![0; 1024];
loop {
// Wait for the pipe to be readable
client.readable().await?;
// Try to read data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match client.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-client-try-read";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
client.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 client.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-client-try-read-vectored";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
client.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 client.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 client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
// Wait for the pipe to be readable
client.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 client.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-client-writable";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
// Wait for the pipe to be writable
client.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match client.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 будет вызван Waker::wake.
Обратите внимание, что при нескольких вызовах poll_write_ready или poll_write пробуждение запланировано только для Waker из Context, переданного при последнем вызове. (Однако poll_read_ready сохраняет второй, независимый waker.)
Эта функция предназначена для случаев, когда создание и закрепление 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-client-try-write";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
loop {
// Wait for the pipe to be writable
client.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match client.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-client-try-write-vectored";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let client = named_pipe::ClientOptions::new().open(PIPE_NAME)?;
let bufs = [io::IoSlice::new(b"hello "), io::IoSlice::new(b"world")];
loop {
// Wait for the pipe to be writable
client.writable().await?;
// Try to write data, this may still fail with `WouldBlock`
// if the readiness event is a false positive.
match client.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 NamedPipeClient, поскольку это нарушит работу флага готовности и может привести к неправильной работе канала.
Этот метод не предназначен для использования с объединёнными интересами. Замыкающая функция должна выполнять только один тип операции ввода-вывода, поэтому ей не должно требоваться более одного состояния готовности. При вызове с объединённым интересом этот метод может вызвать панику или бесконечно ожидать.
Обычно с этой функцией используют 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 NamedPipeClient, поскольку это нарушит работу флага готовности и может привести к неправильной работе канала.
Этот метод не предназначен для использования с объединёнными интересами. Замыкающая функция должна выполнять только один тип операции ввода-вывода, поэтому ей не должно требоваться более одного состояния готовности. При вызове с объединённым интересом этот метод может вызвать панику или бесконечно ожидать.
Реализации трейтов
impl AsHandle for NamedPipeClient
fn as_handle(&self) -> BorrowedHandle<'_>
docsrs and Unix and (crate features fs or net).impl AsRawHandle for NamedPipeClient
fn as_raw_handle(&self) -> RawHandle
docsrs and Unix and (crate features fs or net).impl AsyncWrite for NamedPipeClient
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 NamedPipeClient
impl RefUnwindSafe for NamedPipeClient
impl Send for NamedPipeClient
impl Sync for NamedPipeClient
impl Unpin for NamedPipeClient
impl UnsafeUnpin for NamedPipeClient
impl UnwindSafe for NamedPipeClient
Обобщённые реализации
impl<R> AsyncReadExt for R
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 для 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.NamedPipeClient.html