pub struct OwnedReadHalf { /* 私有字段 */ }展开描述
TcpStream 的 owned 读半部,由 into_split 创建。
从 OwnedReadHalf 读取通常使用 AsyncReadExt trait 上提供的便捷方法来完成。
实现§
源代码§impl OwnedReadHalf
impl OwnedReadHalf
源代码pub fn reunite(self, other: OwnedWriteHalf) -> Result<TcpStream, ReuniteError>
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>>
pub fn poll_peek( &mut self, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<usize>>
尝试在套接字上接收数据,但不会从队列中移除该数据,如果数据尚不可用,则注册当前任务以进行唤醒。
请注意,在多次调用 poll_peek 或 poll_read 时,只有传递给最近一次调用的 Context 中的 Waker 会被调度以接收唤醒。
有关更多详细信息,请参阅 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>
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 trait 上。
源代码pub async fn ready(&self, interest: Interest) -> Result<Ready>
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<()>
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>
pub fn try_read(&self, buf: &mut [u8]) -> Result<usize>
尝试从流中读取数据到提供的缓冲区,返回读取的字节数。
接收套接字上任何待处理的数据,但不会等待新数据到达。成功时返回读取的字节数。由于 try_read() 是非阻塞的,缓冲区不必由异步任务存储,可以完全存在于栈上。
通常,readable() 或 ready() 与此函数配对使用。
§返回值
如果成功读取数据,则返回 Ok(n),其中 n 是读取的字节数。如果 n 为 0,则可能表示以下两种情况之一:
- The stream’s read half is closed and will no longer yield data.
- The specified buffer was 0 bytes in length.
如果流未准备好读取数据,则返回 Err(io::ErrorKind::WouldBlock)。
源代码pub fn try_read_vectored(&self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
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 peer_addr(&self) -> Result<SocketAddr>
pub fn peer_addr(&self) -> Result<SocketAddr>
返回此流连接到的远程地址。
源代码pub fn local_addr(&self) -> Result<SocketAddr>
pub fn local_addr(&self) -> Result<SocketAddr>
返回此流绑定的本地地址。