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

Io 如何轮询std::net::UdpSocket?,io,network-programming,rust,Io,Network Programming,Rust,对于Rust,它似乎只有send(),recv(),和设置非阻塞(bool)。这是一组相当有限的函数,例如,recv()总是阻塞直到收到数据包,而recv\u nonblocking()从不阻塞,甚至可能在收到数据包时调用函数 除了像这样疯狂的事情之外,还有什么方法可以做recv\u nonblocking(): fn recv_nonblocking(socket: &UdpSocket, buf: &mut [u8]) -> Result<usize> {

对于Rust,它似乎只有
send()
recv()
,和
设置非阻塞(bool)
。这是一组相当有限的函数,例如,
recv()
总是阻塞直到收到数据包,而
recv\u nonblocking()
从不阻塞,甚至可能在收到数据包时调用函数

除了像这样疯狂的事情之外,还有什么方法可以做
recv\u 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
}
fn recv\u非阻塞(套接字:&UdpSocket,buf:&mut[u8])->结果{
试试!(socket.set_nonblocking(true));
//顺便问一下,我怎么知道我的缓冲区有多大?
//似乎没有办法知道一个包的大小
//在它被socket.recv()返回之前。
设res=socket.recv(&mutbuf);
//这也不是真的正确,因为没有get_nonblocking()
//因此,我们无法可靠地恢复以前的状态。
试试!(socket.set_nonblocking(false));
物件
}

这会起作用吗?

通常,在套接字的整个生命周期中,您要么使用阻塞模式,要么使用非阻塞模式。在阻塞模式下,您可以使用
set\u read\u timeout
get\u read\u timeout

recv\u nonblocking 只需调用
set\u nonblocking
,然后调用
recv
。如果要在同一个套接字上同时使用阻塞和非阻塞I/O,可以编写简单的包装函数:

fn recv_nonblocking(this: &UdpSocket, buf: &mut [u8]) -> io::Result<usize> {
    this.set_nonblocking(true);
    this.recv(buf)
}
fn recv_非阻塞(this:&UdpSocket,buf:&mut[u8])->io::Result{
此项。设置_非阻塞(true);
这个.recv(buf)
}
recv_回调 良好的异步I/O原语被排除在标准库之外,因此可以迭代设计工作,而无需锁定语言的稳定性保证和发布周期


要查看的板条箱是。

我如何知道缓冲区有多大?好吧,您可能会使用传入的
buf
,而不是创建自己的缓冲区。你至少应该试着编译代码。哈,是的,没错。我忘了我通过了一次考试。但问题仍然存在:被叫用户如何知道自己的规模有多大?作为一名20k代表用户,您已经知道您只需提问。那样我们就可以了^_^