我必须重复调用该函数来获取所有数据,因为len参数设置为10240.但这最终会导致阻塞。如何以独立于平台的方式获取所有数据并安全返回?
BTW,我在发送方使用netcat:
cat ocr_pi.png | nc -u服务器5555
这个问题是否与nc的行为有关?我没有找到任何设置UDP数据包大小的参数(-O代表TCP)。 感谢。
答案 0 :(得分:2)
UDP作为消息发送和接收数据。在len
参数中,您告诉recvfrom()
您可以接收的最大邮件大小,然后recvfrom()
等待完整邮件到达,无论其大小如何。 UDP消息是自包含的。与TCP不同,不能部分发送/接收UDP消息。这是一个全有或全无的事情。如果收到的消息的大小大于您指定的len
值,则会丢弃该消息,并且您会收到错误。
recvfrom()
阻止的唯一方法是,如果没有可供阅读的消息。如果您不想阻止,请使用select()
(或pselect()
或epoll
或其他等效平台)指定等待邮件到达的超时,然后调用{{ 1}}只有在确实有东西需要阅读的时候。