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