Структура Owned Read Half
pub struct OwnedReadHalf { /* private fields */ }
net.Принадлежащая читающая половина TcpStream, создаваемая методом into_split.
Чтение из OwnedReadHalf обычно выполняется с помощью удобных методов трейта AsyncReadExt.
Реализации
impl OwnedReadHalf
pub fn reunite(self, other: OwnedWriteHalf) -> Result<TcpStream, ReuniteError>
Пытается соединить две половины TcpStream и восстановить исходный сокет. Успешно только в том случае, если обе половины были получены в результате одного и того же вызова into_split.
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 stream = TcpStream::connect("127.0.0.1:8000").await?;
let (mut read_half, _) = stream.into_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 stream = TcpStream::connect("127.0.0.1:8080").await?;
let (mut read_half, _) = stream.into_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 AsRef<TcpStream> for OwnedReadHalf
impl AsyncRead for OwnedReadHalf
Автоматические реализации трейтов
impl Freeze for OwnedReadHalf
impl RefUnwindSafe for OwnedReadHalf
impl Send for OwnedReadHalf
impl Sync for OwnedReadHalf
impl Unpin for OwnedReadHalf
impl UnsafeUnpin for OwnedReadHalf
impl UnwindSafe for OwnedReadHalf
Общие реализации
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.OwnedReadHalf.html