【问题标题】:How to receive multiple UDP packets in C?如何在C中接收多个UDP数据包?
【发布时间】:2010-02-19 00:26:31
【问题描述】:

我创建了一个函数来向服务器发送一个 UDP 数据包并获取返回的数据包。 当我进行单个 recvfrom 调用时,它可以工作,但我需要在定义的超时时间内从服务器获取所有潜在的数据包。

这是我的代码:http://pastebin.be/23548

有人可以帮助我吗? 谢谢。

【问题讨论】:

    标签: c network-programming udp


    【解决方案1】:

    您在套接字上设置的 SO_RCVTIMEO 选项实际上是一个不活动计时器。换句话说,通过设置 RCVTIMEO,您可以确保即使没有收到任何数据,recvfrom 调用也会在计时器到期后返回。听起来这并不是你想要做的。

    有几种方法可以满足您的要求...这里有一些想法。

    如果您对信号感到满意,您可以使用“setitimer”来跟踪您的最大超时时间。 http://linux.die.net/man/2/setitimer

    它会在计时器到期时向您的进程发送一个 SIGALRM,并且在您的信号处理程序中,您可以设置一个标志来告诉您的 recvfrom 循环退出。

    您也可以在起点获取系统时间,然后在 recvfrom 循环中对其进行轮询,以查看您是否已通过所需的超时值。 http://dell5.ma.utexas.edu/cgi-bin/man-cgi?gettimeofday+2

    【讨论】:

    • 感谢您的回答?在继续之前我还有一个问题......我删除了 fcntl() 函数,现在它又可以工作了,因为还有一个超时。但是现在每个响应都需要 500 毫秒,而在一次调用 recvfrom 时情况并非如此。为什么它会这样?一旦没有从recvfrom获得数据,它不应该立即停止循环吗?看起来现在它只有在超时到达时才返回......
    • recvfrom 是一个阻塞调用。因此,如果没有数据包并且您没有设置 SO_RCVTIMEO(或 O_NONBLOCK),它将永远阻塞。我假设您采用了信号路由,这会导致 recvfrom 调用在计时器到期时中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多