gpt4 book ai didi

io - 我如何轮询 std::net::UdpSocket?

转载 作者:行者123 更新时间:2023-11-29 08:33:25 25 4
gpt4 key购买 nike

使用 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
}

那还能行吗?

最佳答案

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)
}

接收回调

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

要查看的 crate 是 mio .

关于io - 我如何轮询 std::net::UdpSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com