recvfrom()只能从UDP套接字获取最多2048个字节

时间:2013-09-23 14:42:04

标签: sockets udp

我必须重复调用该函数来获取所有数据,因为len参数设置为10240.但这最终会导致阻塞。如何以独立于平台的方式获取所有数据并安全返回?

BTW,我在发送方使用netcat:

  

cat ocr_pi.png | nc -u服务器5555

这个问题是否与nc的行为有关?我没有找到任何设置UDP数据包大小的参数(-O代表TCP)。 感谢。

1 个答案:

答案 0 :(得分:2)

UDP作为消息发送和接收数据。在len参数中,您告诉recvfrom()您可以接收的最大邮件大小,然后recvfrom()等待完整邮件到达,无论其大小如何。 UDP消息是自包含的。与TCP不同,不能部分发送/接收UDP消息。这是一个全有或全无的事情。如果收到的消息的大小大于您指定的len值,则会丢弃该消息,并且您会收到错误。

recvfrom()阻止的唯一方法是,如果没有可供阅读的消息。如果您不想阻止,请使用select()(或pselect()epoll或其他等效平台)指定等待邮件到达的超时,然后调用{{ 1}}只有在确实有东西需要阅读的时候。