2014-03-29 41 views
0

我有一个考虑udp数据包生命/路由的问题。我有一个简单的客户端服务器UDP方案,在客户端发送呼叫,在服务器端接收呼叫。假设发送方法被调用,并且数据包实际到达另一侧,但服务器的代码执行尚未到达接收方法调用。在那个时候,数据包会发生什么?现在,我尝试在收到呼叫之前用一个简单的命令输入提示来停止执行,等待一会儿,然后让它继续并注意到该数据包已收到。你能解释一下为什么会发生这种情况,就像它在不同的OSI级别上缓冲一样?Java中的UDP数据包路由

在此先感谢。

回答

1

每个TCP或UDP套接字都有一个发送缓冲区和一个接收缓冲区。你的数据报在发送方排入发送缓冲区,然后发送,然后它在接收方排入接收缓冲区,然后从那里读取。

+0

这是假设他已经设置了'DatagramSocket'(即'DatagramSocket server = new DatagramSocket(port)',我想他已经有了这种情况下应该有一个接收缓冲区,正如你所说的 – Jared

+1

@Jared明显地。如果他没有创建套接字,那么数据就不会在任何地方排队,问题就不存在了。回想一下你自己有点猜测的答案,UDP会从NIC获得一个中断,将数据拉出来,看到它是对于不存在的端口,将其丢弃,然后发出ICMP错误消息。 – EJP

+0

我删除了我的答案,这显然是错误的。 – Jared

0

“receive”方法调用不接收数据包。如果该端口有一个“打开”的UDP套接字,则表示分配了缓冲区空间,这就是NIC + OS放置数据的位置。当你打电话给“接收”时,它只是看起来那里,如果有什么,那么它假装刚刚收到它。

我应该补充一点,如果缓冲区为空,那么接收调用会进入阻塞状态,等待操作系统通知某事已到达。