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

我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,并且可能在接收器端以多个数据包的forms到达。 例如,如果我在数据报包中发送1000字节数据,则在接收端它可能会以2字节,500字节,12字节等forms到达。 因此,他建议多次接收(…)接收发送方发送的整个1000字节的数据包。

后来当我浏览数据报套接字接收(…)的Java文档时,有一行读取如下:“此方法一直阻塞,直到收到数据报。…”是否表示收到整个数据报包当我们使用Java时,不需要进行多次接收(即使理论上是这种情况)?

PLS。 澄清。 如果每个数据包的多次接收(…)是解决此问题的唯一选择,请参阅。 提出如何做到这一点的建议。

receive()任何调用都会给你一个完整的数据包 – 片段处理发生在套接字下面的两层。 碎片和碎片整理发生在网络/ Internet层( IP )中,因此套接字永远不会看到碎片,但只接收完整和完整的UDP / TCP数据包(只有完整的数据包才会被发送到监听端口)。

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

如果您在接收数据包时遇到问题,您可能还需要检查方法getReceiveBufferSize()setReceiveBufferSize() – 如果缓冲区大小小于数据包大小,则无法保证您可以接收数据包。