作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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
}
那还能行吗?
最佳答案
只需调用 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/
我是一名优秀的程序员,十分优秀!