如何在C语言中接收多个UDP数据包?

如何在C语言中接收多个UDP数据包?,c,network-programming,udp,C,Network Programming,Udp,我制作了一个函数,将UDP数据包发送到服务器并获取返回的数据包。 当我进行一次recvfrom调用时,它可以工作,但我需要在定义的超时内从服务器获取所有潜在的数据包 这是我的密码: 有人能帮我吗? 谢谢。您在套接字上设置的SO_RCVTIMEO选项实际上是一个非活动计时器。换句话说,通过设置RCVTIMEO,您可以确保即使没有收到任何数据,recvfrom调用也会在计时器过期后返回。听起来你并不是这么想的 有几种方法可以满足您的要求。。。这里有几个想法 如果您对信号感到满意,可以使用“设置定时器

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

这是我的密码:

有人能帮我吗?
谢谢。

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

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

如果您对信号感到满意,可以使用“设置定时器”来跟踪最大超时。

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

您也可以在起点获取系统时间,然后在recvfrom循环中轮询它,以查看是否已通过所需的超时值。

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

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

如果您对信号感到满意,可以使用“设置定时器”来跟踪最大超时。

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

您也可以在起点获取系统时间,然后在recvfrom循环中轮询它,以查看是否已通过所需的超时值。

谢谢您的回答?在继续之前我还有一个问题。。。我删除了fcntl()函数,现在它再次工作,因为还有一个超时。但是现在每个响应都需要500毫秒,而调用recvfrom一次就不是这样了。为什么会这样?如果没有从recvfrom获取的数据,它不应该停止循环吗?现在看来,它只在超时到达时返回…recvfrom是一个阻塞调用。因此,如果没有数据包,并且您没有设置So_RCVTIMEO(或O_NONBLOCK),它将永远阻塞。我想你走的是信号路线,这会导致recvfrom呼叫在计时器到期时中断。谢谢你的回答?在继续之前我还有一个问题。。。我删除了fcntl()函数,现在它再次工作,因为还有一个超时。但是现在每个响应都需要500毫秒,而调用recvfrom一次就不是这样了。为什么会这样?如果没有从recvfrom获取的数据,它不应该停止循环吗?现在看来,它只在超时到达时返回…recvfrom是一个阻塞调用。因此,如果没有数据包,并且您没有设置So_RCVTIMEO(或O_NONBLOCK),它将永远阻塞。我假设您采用了信号路由,这将导致recvfrom调用在计时器到期时中断。