在UDP套接字的情况下,为什么后续recvfrom()调用被阻塞
在简单的客户机-服务器程序中,客户机正在发送12字节的数据。我正在使用recvfrom(),在连续调用中请求2和10个字节。在第一次调用的情况下,recvfrom()返回2个字节。但第二个呼叫是阻塞。为什么会这样?我认为TCP套接字不会发生这种情况,连续的读取调用返回可用字节(这里是10) 具有以下相关信息(粗体添加): 对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参数中未设置MSG_PEEK,多余的字节将被丢弃 您需要在一次通话中阅读它。包含以下相关信息(粗体添加): 对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参数中未设置MSG_PEEK,多余的字节将被丢弃在UDP套接字的情况下,为什么后续recvfrom()调用被阻塞,c,linux,sockets,io,C,Linux,Sockets,Io,在简单的客户机-服务器程序中,客户机正在发送12字节的数据。我正在使用recvfrom(),在连续调用中请求2和10个字节。在第一次调用的情况下,recvfrom()返回2个字节。但第二个呼叫是阻塞。为什么会这样?我认为TCP套接字不会发生这种情况,连续的读取调用返回可用字节(这里是10) 具有以下相关信息(粗体添加): 对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参
您需要在一次调用中读取它。我认为您对recvfrom函数的第三个(
len
)参数感到困惑
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
后者表示缓冲区(void*buf
)有多大,而不是要从数据包中提取多少字节
在UDP
类型套接字中,您必须读取另一个对等方发送给您的整个数据包(UDP
确保它不会碎片化),并避免重复读取发送的数据,就像TCP
模式一样
在您的情况下,如果您的缓冲区是2个字节,那么其他10个字节将被丢弃(请参阅
recvfrom
手册页)我认为您对recvfrom函数的第三个(len
)参数感到困惑
ssize_t recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
后者表示缓冲区(void*buf
)有多大,而不是要从数据包中提取多少字节
在UDP
类型套接字中,您必须读取另一个对等方发送给您的整个数据包(UDP
确保它不会碎片化),并避免重复读取发送的数据,就像TCP
模式一样
在您的情况下,如果缓冲区是2个字节,那么其他10个字节将被丢弃(查看recvfrom
手册页)