4

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

后来,当我浏览数据报套接字接收(...)的Java文档时,有一行内容如下:“此方法阻塞,直到接收到数据报。...”是否意味着接收到整个数据报包并且当我们使用Java时不需要进行多次接收(即使理论上是这样)?

请。阐明。如果每个数据包的多个接收(...)是解决此问题的唯一选择,请。就如何做到这一点提出建议。

4

1 回答 1

4

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

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

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

于 2013-04-18T05:05:39.900 回答