UDP服务器在同一子网中具有多个地址

时间:2012-06-28 11:04:00

标签: java udp

我有一个运行自定义UDP服务器的双节点集群。群集具有公共IP地址,并且每个节点在同一子网中具有自己的专用IP地址。

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

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

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

我能做什么:

  1. 重写check_udp以使用bind()而不是connect()。这是一种痛苦,没有人保证将来不会有任何类似的客户。
  2. 仅将服务器绑定到公共IP。可能,但需要一些额外的群集设置才能在IP启动后启动服务器。它会增加故障转移时间并引入不必要的服务器重启。现在,服务器总是在两个节点上运行,准备接受请求。
  3. 修改服务器以从收到请求的同一地址回复。这是最好的方法,但我需要找出有问题的地址才能做到这一点。我还需要一种方法来发送来自该地址的回复 - 有没有办法在不关闭并重新打开套接字的情况下执行此操作?
  4. 修改服务器以尝试不时绑定到公共IP。可能,但很麻烦。如何处理已在套接字上激活的客户端?
  5. 这里有什么我想念的吗?它似乎不应该是一项非常艰巨的任务,但我似乎并没有找到一个简单的解决方案。

1 个答案:

答案 0 :(得分:0)

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

这与其他网络库(0MQ专门命名一个)处理此消息的来源以及响应问题的位置相同。