1

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

顺便说一句,我在发件人端使用 netcat:

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

这个问题与 nc 的行为有关吗?我没有找到任何参数来设置 UDP 数据包大小(-O 用于 TCP)。谢谢。

4

1 回答 1

2

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

阻止的唯一方法recvfrom()是没有可读取的消息。如果您不想阻止,请使用select()(或pselect()epoll其他平台等效项)指定等待消息到达的超时时间,然后recvfrom()仅在确实有要阅读的内容时才调用。

于 2013-09-23T22:06:29.103 回答