如何轮询std :: net :: UdpSocket?

时间:2016-09-14 09:26:14

标签: io network-programming rust

使用Rust' UdpSocket,它似乎只有send()recv()set_nonblocking(bool)。这是一组相当有限的功能,例如让recv()始终阻塞直到收到数据包并recv_nonblocking()永远不会阻塞,甚至recv_callback()在收到数据包时调用函数会很好。

除了像这样疯狂的事情之外,还有什么方法可以做recv_nonblocking()

fn recv_nonblocking(socket: &UdpSocket, buf: &mut [u8]) -> Result<usize> {

    try!(socket.set_nonblocking(true));

    // By the way, how do I know how big to make my buffer?
    // There doesn't seem to be any way to know the size of a packet
    // before it is returned by socket.recv().

    let res = socket.recv(&mut buf);

    // This isn't really right either because there is no get_nonblocking()
    // so we can't reliably restore the previous state.
    try!(socket.set_nonblocking(false));

    res
}

这甚至会起作用吗?

2 个答案:

答案 0 :(得分:0)

通常,您可以在套接字的整个生命周期中使用阻塞或非阻塞模式。在阻止模式下,您可以使用set_read_timeout get_read_timeout代替。

答案 1 :(得分:0)

recv_nonblocking

只需致电set_nonblocking,然后致电recv。如果您真的要在同一个套接字上同时使用阻塞和非阻塞I / O,那么您可以编写简单的包装函数:

fn recv_nonblocking(this: &UdpSocket, buf: &mut [u8]) -> io::Result<usize> {
    this.set_nonblocking(true);
    this.recv(buf)
}

recv_callback

良好的异步I / O原语已被排除在标准库之外,因此可以在不锁定语言的稳定性保证和发布周期的情况下迭代设计工作。

要查看的箱子是mio