c - 收集未知数量的消息,然后继续执行程序

标签 c sockets

我想从套接字中获取多条消息(广播),但我不知道有多少条消息,然后继续执行该程序。 消息由网络中的广播触发,因此它们应该出现在较短的时间窗口内。

我想我想在我之前设置的套接字上循环 recvfrom() 并想使用超时来知道我得到了它们。对于超时,我考虑了 select()setsockopt() 并且认为第二个就足够了。

现在的问题是当我的 recvfrom() 超时时会发生什么。 它是否返回 -1 并设置一个 errno?如果是,errno 是什么?这样我就可以获取它并继续。

还是换一种方式更好?

最佳答案

如果 O_NONBLOCK 没有在消息到达的套接字上设置。

如果套接字上没有可用消息,并且套接字的文件描述符上未设置O_NONBLOCK,则recvfrom() 将阻塞直到消息到达。

如果套接字上没有可用消息并且套接字的文件描述符上设置了O_NONBLOCKrecvfrom() 将失败并将错误号设置为EAGAINEWOULDBLOCK

关于返回值

成功完成后,recvfrom() 应返回消息的字节长度。如果没有消息可用于接收并且对等方已执行有序关闭,recvfrom() 应返回 0。否则,该函数应返回-1 并设置errno 以指示错误。

可以找到更多详细信息here

关于c - 收集未知数量的消息,然后继续执行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30980305/

相关文章:

c++ - select() 是否可以实现单套接字读/写超时?

c - 如何将变量移交给* char函数?

python-2.7 - Python asyncore 与 UDP

c++ - TCP协议(protocol),减少RTT瓶颈

c - for循环第一条语句应该是声明

c - 在c中返回指向字符串文字的指针

c - 在 strcat() 中编程段错误

具有真实IP地址的python Socket服务器

c - 在路由器上拦截 udp 数据包

c# - System.IO.Stream.Read 卡住