c - UDP 接收超时选项 linux c

标签 c linux udp

我正在使用如下方式设置 UDP 接收超时选项:

    struct timeval t;
    t.tv_sec = 0;
    t.tv_usec = 5;

    if(setsockopt(destination_fd, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(t)) == -1){
        perror("Setting SO_RCVTIMEO option in UDP socket for destination RX: ");
        print_error_and_exit("Couldn't set SO_RCVTIMEO option in UDP socket for destination RX");
    }

我想将 UDP 接收超时设置为 5 微秒,但这不起作用。

当没有接收到数据包时,UDP 至少需要 4 毫秒才能超时,即使我设置了 5 微秒也是如此。

如果没有可用数据包,我如何在 5 微秒内超时。

我猜可能是进程进入了阻塞状态,而调度器调度了其他进程,所以总是需要大约 4 毫秒。如果是这样,如果没有数据可接收,我如何调用 recvfrom() 以接收 UDP 数据包失败而不阻塞?

最佳答案

5 微秒是一个非常小的持续时间,您需要更多时间才能切换到内核来处理您的 recv 系统调用。 4 毫秒虽然对我来说听起来有点长。

您可以做的最快的事情是根本不设置超时,使用 select 检查套接字是否有待处理的数据包。

关于c - UDP 接收超时选项 linux c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120380/

相关文章:

c++ - 向串行端口发送和接收 int 值

c - (int ret = 0; !ret && ret !=0) 之间的区别

c - 从文件中搜索和打印字符串时,打印的是每一行,而不是我需要的那一行

asp.net-mvc - Ubuntu 16.10 和 .net 核心 MVC Web 应用程序

c - 如何在 C 中将多个列表(hlist)作为函数参数传递

php - wget 从自定义网站下载由 PHP 加载的所有图像

linux - 打开/var/log/syslog 并使用 poll() 读取数据,但 poll() 总是再次读取相同的数据

linux - UDP 服务器出现段错误

java - Java接收UDP数据

android - Android 7.1.1 上的 DatagramSocket 问题