gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:15:47 25 4
gpt4 key购买 nike

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

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

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

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

我能做什么:

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

我在这里缺少什么吗?看起来这不应该是一项非常困难的任务,但我似乎找不到一个简单的解决方案。

最佳答案

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

这与其他网络库(特别是 0MQ)处理此消息来自何处以及响应问题的整个过程的方式相同。

关于java - 同一子网中具有多个地址的 UDP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11243247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com