在简单的客户端-服务器程序中,客户端发送12个字节的数据。我使用recvfrom(),在连续的调用中请求2字节和10字节。在第一次调用时,recvfrom()返回2个字节。但是第二个调用是阻塞的。为什么会这样呢?我认为TCP套接字不会发生这种情况,在TCP套接字中,连续的读取调用会返回可用的字节(这里是10)。
发布于 2013-02-12 02:20:05
man page包含以下相关信息(加粗):
对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在单个操作中读取整个消息。如果消息太长,无法放入所提供的缓冲区,并且未在MSG_PEEK参数中设置标志,则应丢弃多余的字节。
您需要在一个调用中读取它。
发布于 2013-02-12 02:29:23
我想您对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手册页)
https://stackoverflow.com/questions/14818284
复制相似问题