为什么在UDP套接字的情况下连续的recvfrom()调用是阻塞的

时间:2013-02-11 18:15:16

标签: c linux sockets io

在简单的客户端 - 服务器程序中,客户端正在发送12个字节的数据。我正在使用recvfrom(),在连续调用中请求2和10个字节。在第一次调用的情况下,recvfrom()返回2个字节。但第二个电话是封锁。为什么会这样?我认为TCP套接字不会发生,其中连续的读取调用返回可用字节(这里为10)。

2 个答案:

答案 0 :(得分:5)

man page具有以下相关信息(粗体添加):

  

对于基于消息的套接字,例如SOCK_RAW,SOCK_DGRAM和SOCK_SEQPACKET,应在单个操作中读取整个消息。如果消息太长而无法容纳在提供的缓冲区中,并且未在flags参数中设置MSG_PEEK,则将丢弃多余的字节

您只需一次通话即可阅读。

答案 1 :(得分:1)

我认为你对recvfrom函数的第三个(len)参数感到困惑。

ssize_t recvfrom(int s, void *buf, size_t len, int flags,
                 struct sockaddr *from, socklen_t *fromlen);

后者表示缓冲区(void *buf)的大小,而不是要从数据包中提取的字节数。

UDP类型套接字中,您必须读取另一个对等方发送给您的整个数据包(UDP确保它不会被分段)并避免多次读取发送的数据,如{{ 1}}模式。

在你的情况下,如果你的缓冲区是2个字节,那么另外10个将被丢弃(查看TCP手册页)