提问者:小点点

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


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

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

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

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

我能做的是:

    <仅将服务器绑定到公共IP。可能,但需要一些额外的群集设置,只有在启动IP后才启动服务器。这将增加故障转移时间,并引入不必要的服务器重新启动。现在,服务器始终在两个节点上运行,准备接受请求。/LI> 上已处于活动状态的客户端

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


共1个答案

匿名用户

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

这与其他网络库(0MQ)处理此消息来自何处和何处响应问题的方式相同。