【问题标题】:Java + UDP + DatagramSocket: Why is a PortUnreachableException thrown, when UDP is designed to be connection-less?Java + UDP + DatagramSocket:当 UDP 设计为无连接时,为什么会抛出 PortUnreachableException?
【发布时间】:2020-01-07 14:46:30
【问题描述】:

当 UDP 本身被设计为无连接时,我无法理解为什么在 Java 中可以从 DatagramSocket 抛出 PortUnreachableException。我对 UDP 的理解是,数据包在无法传递时会被丢弃。为什么使用 DatagramSocket 的 Java 实现 UDP 会提供有关数据包传递的反馈?

【问题讨论】:

    标签: java networking udp


    【解决方案1】:

    在这种情况下,“无连接”是指 UDP 不通过握手来建立连接。而且,除非服务器协议被设计为发送它们,否则不会确认收到已发送的数据包,因此 UDP 确实具有连接的套接字。不是一回事。

    虽然 DatagramSocket 有一个 connect 方法,但 API 声明:

    如果套接字连接的远程目标没有 存在,或者无法访问,并且如果 ICMP 目标 已收到该地址的无法到达的数据包,然后 随后调用发送或接收可能会抛出一个 端口无法访问异常。请注意,不能保证 会抛出异常。

    因此,您可以将数据发送到某个地址而没有任何迹象表明实际上没有连接。

    这一切都取决于操作系统的实现,例如在 Linux 中,有一种方法可以建立连接以优化路由 http://man7.org/linux/man-pages/man7/udp.7.html#DESCRIPTION 提高性能,因为 UDP 不是未来的路由,所以如果事先调用 connect,它将能够显着提高性能 你可以阅读更多关于这个in this answer 的内容,特别是关于 Linux 中的 UDP

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2021-12-01
      • 2022-01-16
      相关资源
      最近更新 更多