Структура Read Half
pub struct ReadHalf<'a>(/* private fields */);
net.Заимствованная половина для чтения из TcpStream, созданная методом split.
Чтение из ReadHalf обычно выполняется с помощью удобных методов, предоставляемых трейтом AsyncReadExt.
Реализации
impl ReadHalf<'_>
pub fn poll_peek( &mut self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<usize>>
Пытается получить данные из сокета, не удаляя их из очереди, и регистрирует текущую задачу для пробуждения, если данные ещё недоступны.
Обратите внимание: при нескольких вызовах poll_peek или poll_read пробуждение будет запланировано только для Waker из Context, переданного при последнем вызове.
Дополнительные сведения см. в документации метода TcpStream::poll_peek.
Примеры
use tokio::io::{self, ReadBuf};
use tokio::net::TcpStream;
use std::future::poll_fn;
#[tokio::main]
async fn main() -> io::Result<()> {
let mut stream = TcpStream::connect("127.0.0.1:8000").await?;
let (mut read_half, _) = stream.split();
let mut buf = [0; 10];
let mut buf = ReadBuf::new(&mut buf);
poll_fn(|cx| {
read_half.poll_peek(cx, &mut buf)
}).await?;
Ok(())
}pub async fn peek(&mut self, buf: &mut [u8]) -> Result<usize>
Получает данные из сокета от удалённого адреса, с которым он соединён, не удаляя их из очереди. В случае успеха возвращает количество просмотренных байтов.
Дополнительные сведения см. в документации метода TcpStream::peek.
Примеры
use tokio::net::TcpStream;
use tokio::io::AsyncReadExt;
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// Connect to a peer
let mut stream = TcpStream::connect("127.0.0.1:8080").await?;
let (mut read_half, _) = stream.split();
let mut b1 = [0; 10];
let mut b2 = [0; 10];
// Peek at the data
let n = read_half.peek(&mut b1).await?;
// Read the data
assert_eq!(n, read_half.read(&mut b2[..n]).await?);
assert_eq!(&b1[..n], &b2[..n]);
Ok(())
}Метод read определён в трейте AsyncReadExt.
pub async fn ready(&self, interest: Interest) -> Result<Ready>
Ожидает наступления любого из запрошенных состояний готовности.
Эту функцию обычно используют вместе с try_read(). Её можно использовать вместо readable(), чтобы проверить возвращённый набор состояний готовности на наличие событий Ready::READABLE и Ready::READ_CLOSED.
Функция может завершиться, даже если сокет не готов. Это ложное срабатывание, и попытка выполнить операцию вернёт io::ErrorKind::WouldBlock. Функция также может вернуть пустой набор Ready, поэтому всегда проверяйте возвращённое значение и, если запрошенные состояния не установлены, при необходимости ожидайте снова.
Эта функция эквивалентна TcpStream::ready.
Безопасность при отмене
Этот метод безопасен при отмене. После наступления события готовности метод будет сразу завершаться при каждом вызове, пока это событие не будет обработано попыткой чтения или записи, завершившейся с ошибкой WouldBlock или Poll::Pending.
pub async fn readable(&self) -> Result<()>
Ожидает, пока сокет не станет доступен для чтения.
Эта функция эквивалентна ready(Interest::READABLE) и обычно используется вместе с try_read().
Эта функция также эквивалентна TcpStream::ready.
Безопасность при отмене
Этот метод безопасен при отмене. После наступления события готовности метод будет сразу завершаться при каждом вызове, пока это событие не будет обработано попыткой чтения, завершившейся с ошибкой WouldBlock или Poll::Pending.
pub fn try_read(&self, buf: &mut [u8]) -> Result<usize>
Пытается прочитать данные из потока в предоставленный буфер и возвращает количество прочитанных байтов.
Получает все ожидающие данные из сокета, но не ждёт поступления новых данных. В случае успеха возвращает количество прочитанных байтов. Поскольку try_read() работает в неблокирующем режиме, буфер не требуется сохранять в асинхронной задаче, и он может полностью размещаться в стеке.
Обычно вместе с этой функцией используется readable() или ready().
Возвращаемое значение
Если данные успешно прочитаны, возвращается Ok(n), где n — количество прочитанных байтов. Если n равно 0, это может указывать на один из двух сценариев:
- Половина потока для чтения закрыта и больше не будет предоставлять данные.
- Длина указанного буфера равна 0 байт.
Если поток не готов к чтению данных, возвращается Err(io::ErrorKind::WouldBlock).
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).
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).
pub fn peer_addr(&self) -> Result<SocketAddr>
Возвращает удалённый адрес, к которому подключён этот поток.
pub fn local_addr(&self) -> Result<SocketAddr>
Возвращает локальный адрес, к которому привязан этот поток.
Реализации трейтов
Автоматические реализации трейтов
impl<'a> Freeze for ReadHalf<'a>
impl<'a> RefUnwindSafe for ReadHalf<'a>
impl<'a> Send for ReadHalf<'a>
impl<'a> Sync for ReadHalf<'a>
impl<'a> Unpin for ReadHalf<'a>
impl<'a> UnsafeUnpin for ReadHalf<'a>
impl<'a> UnwindSafe for ReadHalf<'a>
Общие реализации
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<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/tcp/struct.ReadHalf.html