gpt4 book ai didi

rust - 从 mio::udp::UdpSocket.recv 接收部分 UDP 数据包

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

我正在使用 mio::udp::UdpSocket 接收对来自客户端的请求的响应。看起来我在触发事件上收到了部分 UDP 数据包。我不确定这是否是 mio 库中的错误。

我已经尝试过 PollOpt::level()、all()、empty()、edge() 等。我想我通常需要基于 poll() 文档的 level(),但它们都不起作用。通过添加 20 毫秒的 sleep ,我得到了完整的数据包。

作为引用,当使用阻塞 std::net::UdpSocket 时,我没有发现任何问题。老实说,如果 std::net::SocketOpts 稳定,我就会使用它。使用 mio 的目的是在套接字上获得超时,看起来 net2 将取代 std::net,但即使是 net2 也没有 recv 超时。

这是事件循环的代码:

sleep_ms(20);

let mut event_loop: EventLoop<Response> = try!(EventLoop::new());

if event_loop.timeout_ms((), 5000).is_err() { return Err(ClientError::TimerError) };
try!(event_loop.register_opt(&self.socket, RESPONSE, EventSet::readable(), PollOpt::all()));

let mut response: Response = Response::new(&self.socket);

try!(event_loop.run_once(&mut response));

这是处理程序的代码:

fn ready(&mut self, _: &mut EventLoop<Self>, token: Token, events: EventSet) {
match token {
RESPONSE => {
if !events.is_readable() {
debug!("got woken up, but not readable: {:?}", token);
return
}

let recv_result = self.socket.recv_from(&mut self.buf);
if recv_result.is_err() {
// debug b/c we're returning the error explicitly
debug!("could not recv_from on {:?}: {:?}", self.socket, recv_result);
self.error = Some(recv_result.unwrap_err().into());
return
}

if recv_result.as_ref().unwrap().is_none() {
// debug b/c we're returning the error explicitly
debug!("no return address on recv_from: {:?}", self.socket);
self.error = Some(ClientError::NoAddress);
return
}

let addr = Some(recv_result.unwrap().unwrap());
debug!("bytes: {:?} from: {:?}", self.buf.len(), addr);
},
_ => error!("unrecognized token: {:?}", token),
}
}

最佳答案

只是跟进,上面逻辑中的错误是 run_once() 运行一次滴答,而不是一个“事件”,这是一个错误的假设(尽管公平地说,接口(interface)目前没有很好的记录).

在任何情况下,这都不是部分数据包问题,而是在 run_once() 逻辑运行之前数据包没有被传送的问题,在套接字上没有看到任何东西并立即返回。

我已经更改我的处理程序以在收到数据包并使用 run() 而不是 run_once() 后执行 event_loop.shutdown()。

关于rust - 从 mio::udp::UdpSocket.recv 接收部分 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580220/

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