我正试图通过recvfrom接收一部分数据包。它实际上是这样的:
recvfrom(sockfd, serialised_meta, 12, flags, src_addr, addrlen);
recvfrom(sockfd, serialised_buf, BUFLEN, flags, src_addr, addrlen);
数据发送方式如下:
bufd->Serialise(serialised_buf, BUFLEN+12);
sendto(sockfd, serialised_buf, BUFLEN+12, flags, dest_addr, addrlen);
因此,我们的想法是首先阅读一些元数据,然后决定是否接收其他内容。问题是如果第二个缓冲区(serialised_buf),我在开始时收到4'/ 0'字节。它似乎不是序列化问题,我之前使用过序列化,而且一切都很酷,而我一次收到整个数据包(元数据和数据)。 关于如何修复它的任何想法?
PS。我知道我可以跳过不必要的字节)但无论如何,为什么会发生这种情况呢?
答案 0 :(得分:10)
UDP不是“流”协议...一旦执行初始recvfrom,数据包的其余部分将被丢弃。第二个recvfrom正在等待下一个数据包...
答案 1 :(得分:3)
UDP对消息进行操作,而不是像TCP那样的流。使用UDP时,sendto()
和recvfrom()
之间存在一对一的关系。没有选项可以在UDP中接收部分数据,它是一种全有或全无的传输方式。您必须一次recvfrom()
整个BUFLEN+12
消息,然后决定是否要实际使用它。这就是UDP工作的方式。