【问题标题】:UDP server with multiple addresses in the same subnet同一子网中具有多个地址的 UDP 服务器
【发布时间】:2012-06-29 21:22:48
【问题描述】:

我有一个运行自定义 UDP 服务器的两节点集群。集群有一个公网IP地址,每个节点在同一个子网中都有自己的私网IP地址。

UDP 服务器绑定到通配符地址,因此它可以接收来自公共或私有 IP 的数据报。问题是我无法控制发送回复的 IP 选择。无论出于何种原因,它似乎默认使用私有 IP。

现在,如果客户端只是向服务器发送命令并在同一端口上侦听回复,这不是问题。但是,一些客户端使用 connect() 调用,这限制了它们从最初发送命令的地址接收回复。如果他们向公共 IP 发送命令并在另一个 IP 上收到答案,他们就会忽略它。值得注意的例子是 Nagios 的 check_udp 插件。

服务器是用 Java 编写的,使用普通的 java.net.DatagramSocket。我在 DatagramPacket 类中没有看到任何用于获取接收数据包的本地 IP 地址的方法。

我能做什么:

  1. 重写 check_udp 以使用 bind() 而不是 connect()。这很痛苦,没有人能保证将来不会有类似的客户。
  2. 仅将服务器绑定到公共 IP。可能,但需要一些额外的集群设置才能仅在 IP 启动后启动服务器。它既会增加故障转移时间,又会引入不必要的服务器重启。目前,服务器始终在两个节点上运行,准备好接受请求。
  3. 修改服务器以从收到请求的同一地址回复。这是最好的方法,但我需要弄清楚有问题的地址才能做到这一点。而且我还需要一种从该地址发送回复的方法 - 有没有办法在不关闭和重新打开套接字的情况下做到这一点?
  4. 修改服务器不定时尝试绑定公网IP。可能,但麻烦。如何处理已在套接字上处于活动状态的客户端?

这里有什么我遗漏的吗?看起来这应该不是一项非常艰巨的任务,但我似乎没有找到一个简单的解决方案。

【问题讨论】:

    标签: java udp


    【解决方案1】:

    我会修改(或包装到传输消息中)通过 UDP 套接字发送的消息,以包括发送者(身份)。

    这与其他网络库(具体命名为 0MQ)处理此消息来自何处以及响应问题的整体方式相同。

    【讨论】:

    • 这不会使 Nagios 插件工作,因为它不知道更高级别的应用程序协议。它只是向特定 IP 地址发送消息,然后等待来自同一地址的响应。如果没有,它会报告服务已关闭。
    猜你喜欢
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2011-11-02
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多