我有一个运行自定义UDP服务器的双节点集群。集群有一个公有IP地址,每个节点在同一个子网中有自己的私有IP地址。
UDP服务器绑定到通配符地址,因此它可以接收来自公共IP或私有IP的数据报。问题是我无法控制发送回复的IP选择。似乎不管什么原因,它都默认使用私有IP。
现在,如果客户机只向服务器发送命令并在同一端口上侦听应答,这不是问题。但是,有些客户机使用connect()调用,这限制了它们接收来自命令最初发送到的地址的应答。如果他们向公共IP发送命令,而在另一个IP上收到答案,他们只是忽略它。一个值得注意的例子是Nagios的check_udp插件。
服务器是使用普通的旧Java.net.DataGramSocket在Java编写的。我在DatagramPacket类中没有看到任何用于获取接收数据包的本地IP地址的方法。
我能做的是:
我是不是遗漏了什么?这看起来并不是一项非常艰巨的任务,但我似乎找不到一个简单的解决方案。
我将修改(或包装到传输消息中)通过UDP套接字发送的消息,以包括发送者(标识)。
这与其他网络库(0MQ)处理此消息来自何处和何处响应问题的方式相同。