Datagramsocket:receive(…)如何处理数据包的分段

我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,并且 可能

以多个包的形式到达接收器端。例如,如果我以数据报包的形式发送1000字节的数据,则在接收端 可能会

到达2字节,500字节,12字节,依此类推。因此,他建议执行多次receive(…)以接收发送方发送的整个1000字节数据包。

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

请 澄清。如果每个数据包都具有多个receive(…)是解决此问题的唯一选择,请。提供有关如何执行此操作的建议。

回答:

任何调用receive()都会给您一个完整的数据包-片段处理在套接字下面的两层中进行。碎片和碎片整理发生在网络/

Internet层(IP)中,因此套接字将永远不会看到碎片,而只会接收完整和完整的UDP

/ TCP数据包(只有完整的数据包才发送到侦听端口)。

因此,不,您不需要多个receive()数据包就可以获取一个数据包,但是您应该意识到UDP是不可靠的,因此,如果一个片段在网络层丢失(在某些情况下,如果出现乱序),您将赢得无法获取数据包。

您可能还需要检查方法,getReceiveBufferSize()并且setReceiveBufferSize()在接收数据包时遇到问题-

如果缓冲区大小小于数据包大小,则不能保证可以接收到数据包。

以上是 Datagramsocket:receive(…)如何处理数据包的分段 的全部内容, 来源链接: utcz.com/qa/415905.html

回到顶部