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