6

我正在尝试通过 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);

所以想法是先读取一些元数据,然后决定是否接收其他内容。问题是如果第二个缓冲区(serialized_buf),我在开始时收到 4 个“/0”字节。这似乎不是序列化问题,我之前使用过序列化,一切都很酷,同时我一次接收整个数据包(元数据和数据)。关于如何修复它的任何想法?

PS。我知道我可以跳过不必要的字节)但是无论如何,为什么会发生这种情况?

4

2 回答 2

14

UDP 不是“流”协议...一旦您执行初始 recvfrom,数据包的其余部分将被丢弃。第二个 recvfrom 正在等待下一个数据包......

于 2012-11-09T23:35:50.910 回答
3

UDP 对消息进行操作,而不是像 TCP 那样对流进行操作。sendto()使用 UDP和recvfrom()使用 UDP 时存在一对一的关系。在 UDP 中没有接收部分数据的选项,它是一种全有或全无的传输类型。您必须recvfrom()一口气读完整个BUFLEN+12消息,然后决定是否要实际使用它。这就是 UDP 的工作方式。

于 2012-11-10T04:09:16.320 回答