DatagramSocket类:如何接收(...)处理的数据包碎片(Datagramsocket:

2019-08-31 10:23发布

我从我的教授认为,使用UDP套接字发送数据报包在较低层被碎片,并且可以在接收端到达的多个数据包就知道了。 对于例如,如果我在数据报包发送1000个字节的数据,在接收端作为,说2个字节,500个字节,12个字节,等等, 可能到达。 因此,他建议做多接收(...)接收由发送方发送的整个1000字节的数据包。

后来,当我通过对数据报套接字Java文档去接收(...),并且存在如下一行:“这个方法将阻塞,直到收到一个数据报......”这是否意味着整个数据报包被接收并不需要做多个接收(即使它在理论上如此)当我们使用Java?

PLS。 澄清。 如果多个接收(...)为每个数据包是解决这个问题的唯一选择,请。 就如何做到这一点的建议。

Answer 1:

任何调用receive()会给你一个完整的包-片段处理发生在插座下面两层。 该碎片和碎片整理发生在网络/互联网层( IP ),所以插座将永远不会看到的片段,但只接收整个饱满UDP / TCP数据包(仅限全包被发送到监听端口)。

所以,不,你不需要多个receive()得到一个单一的数据包,但(如果它到达了的秩序,在某些情况下),你应该知道,UDP是不可靠的,所以如果一个片段被在网络层丢失,你将无法得到该数据包。

您可能还需要检查方法getReceiveBufferSize()setReceiveBufferSize()如果您无法接收数据包-如果缓冲区大小比数据包的大小更小,它不能保证你能收到的数据包。



文章来源: Datagramsocket: how receive(…) handles fragmentation of a packet