跳到主要内容

AsyncUdpSocket

搜索

trait AsyncUdpSocket 

源代码
pub trait AsyncUdpSocket:
    Send
    + Sync
    + Debug
    + 'static {
    // Required methods
    fn create_io_poller(self: Arc<Self>) -> Pin<Box<dyn UdpPoller>>;
    fn try_send(&self, transmit: &Transmit<'_>) -> Result<()>;
    fn poll_recv(
        &self,
        cx: &mut Context<'_>,
        bufs: &mut [IoSliceMut<'_>],
        meta: &mut [RecvMeta],
    ) -> Poll<Result<usize>>;
    fn local_addr(&self) -> Result<SocketAddr>;

    // Provided methods
    fn max_transmit_segments(&self) -> usize { ... }
    fn max_receive_segments(&self) -> usize { ... }
    fn may_fragment(&self) -> bool { ... }
}
展开描述

UDP 套接字的抽象实现,用于运行时无关性

必需方法§

源代码

fn create_io_poller(self: Arc<Self>) -> Pin<Box<dyn UdpPoller>>

创建一个 UdpPoller,可以为一个任务注册“写就绪”通知

单个对象上的 poll_send 方法通常一次只能保存一个 Waker,即最多允许一个调用者等待事件。本方法允许任意数量的感兴趣任务各自构造一个 UdpPoller 对象,它们可以同时等待同一事件并被并发唤醒,因为每个 UdpPoller 都可以独立存储一个 Waker

源代码

fn try_send(&self, transmit: &Transmit<'_>) -> Result<()>

transmits 发送 UDP 数据报;若不能立即发送则返回 WouldBlock 并清除底层套接字的就绪状态;若出错则返回 I/O 错误

若返回 io::ErrorKind::WouldBlock,则必须调用 UdpPoller::poll_writable,以便在可以再次尝试发送时唤醒当前任务。

源代码

fn poll_recv( &self, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>], meta: &mut [RecvMeta], ) -> Poll<Result<usize>>

接收 UDP 数据报,若当前无法接收则注册任务以便后续可能被唤醒

源代码

fn local_addr(&self) -> Result<SocketAddr>

查询该套接字所使用的本地 IP 地址与端口

提供方法§

源代码

fn max_transmit_segments(&self) -> usize

一个 Transmit 最多可承载的数据报数量

源代码

fn max_receive_segments(&self) -> usize

单个 RecvMeta 最多可描述的数据报数量

源代码

fn may_fragment(&self) -> bool

数据报是否可能被拆分为多个片段

为获得最佳性能,套接字应避免这种情况。可参考 IPV6_DONTFRAG 套接字选项。

实现者§