我使用封装在 DLL 中的 libuv UDP 功能。它有效,我可以通过回调发送和接收数据包。现在我需要一个功能来在一段时间后停止我的接收观察者(例如,当没有客户端可用时)。但是当我将超时设置为 10 秒时。计时器回调是随机触发的(例如 0、4、7、10 秒)。我尝试对 UDP 和计时器使用两个不同的循环,但没有改变。是否有用于准确计时的特殊调用约定?
我的初始化函数是:
void udp_app_init(...)
{
...
//some libuv UDP init-functions
uv_timer_init(loop, &my_udp_timeout);
...
}
我的 UDP 发送函数发送实际数据包并启动 UDP 和计时器观察者:
void udp_app_senddata(...)
{
...
uv_udp_send(...);
uv_timer_start(&my_udp_timeout, udp_timeout_action, 10000, 0);
uv_udp_recv_start(&recv_socket, alloc_buffer, vCallBack);
uv_run(loop, UV_RUN_DEFAULT);
}
定时器回调停止定时器观察者和(如果没有数据包到达)UDP接收观察者:
void udp_timeout_action(...)
{
uv_timer_stop(handle);
if(uv_is_active((uv_handle_t*)&recv_socket))
uv_udp_recv_stop(&recv_socket);
}