【问题标题】:UDP receive timeout option linux cUDP接收超时选项linux c
【发布时间】:2014-03-01 21:07:08
【问题描述】:

我正在使用类似这样的方式设置 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 微秒,但这不起作用。

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

如果没有可用的数据包,我怎样才能在 5 微秒内超时。

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

【问题讨论】:

    标签: c linux udp


    【解决方案1】:

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

    最快的方法是不设置超时,使用 select 检查套接字是否有待处理的数据包。

    【讨论】:

    • 您可以做得比使用select 更好。 ppoll 有一个以纳秒为单位的超时时间(显然内核无法在该分辨率下工作,但它比 select 好)。
    • 非常感谢,我从没想过选择。我浪费了 2 天的时间来查找我的程序的哪个部分需要时间,结果是 recvfrom() 阻塞了大约 4 毫秒,而它应该阻塞了 5 微秒。
    • @abligh:如果你真的需要5微秒,那就根本不设置超时,然后分辨率是ns还是s,你传0,都是一样的。
    • 当然知道了。我需要非常小的超时选项,因为我需要一次从 2 个 UDP 套接字接收,如果我对两个套接字都使用非阻塞选项,它会使用吗我的所有 CPU 时间?
    • @Meraman 内核工作在时间片上,正常运行时有 1000HZ 的定时器中断,也就是说超时等概念的分辨率是 1 毫秒,你无法实现低至 5 微秒的超时, 不可能进行非阻塞读取 - 这意味着您需要在 recvfrom()/clock_gettime() 上循环,占用 CPU。
    猜你喜欢
    • 2017-06-07
    • 2018-03-01
    • 2020-07-03
    • 2012-02-13
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多