经由recvfrom的接收分组的一部分(UDP)(Receiving a part of packe

2019-07-03 17:19发布

我试图通过接收一个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);

这样的想法是先读一些元数据,然后决定是否接收别的东西。 的问题是,我接收4“/μ0”字节开头,如果第二缓冲器(serialised_buf)。 它似乎并没有被序列化的问题,我以前用我的系列化,各方面都很冷静,而我是在一次接收整个数据包(元和数据)。 关于如何可以固定任何想法?

PS。 我明白我可以跳过不必要的字节)但无论如何,它为什么会发生?

Answer 1:

UDP不是一个“流”的协议......一旦你做了初步recvfrom的,该包的其余部分被丢弃。 第二recvfrom的正在等待下一个包...



Answer 2:

UDP操作上的消息,而不是像溪流TCP一样。 之间存在1对1的关系sendto()recvfrom()使用UDP时。 没有选项在UDP接收部分数据,这是运输的全有或全无类型。 你必须recvfrom()整个BUFLEN+12一气呵成的消息,然后决定是否要实际使用与否。 这仅仅是UDP的工作方式。



文章来源: Receiving a part of packet via recvfrom (UDP)