Java UDP发送特定IP地址的内容

3

我有一个服务器,有多个IP地址,并且有一个绑定到0.0.0.0的UDP套接字,以便可以从任何一个IP地址接收UDP。那么我如何指定要在发送的UDP数据包中使用的源IP地址呢?我的当前实现正在使用NIO,因此也许使用DatagramChannel来执行发送可能是问题所在。


2
为什么?IP将通过IP路由表正确地路由它们,并将该接口的IP地址放入传出数据报中。请注意,您没有“绑定到0.0.0.0”的Java代码,而是绑定到0.0.0.0的UDP套接字。 - user207421
我发送数据包的系统将使用源IP作为信息,因此我需要从我的本地IP中选择特定的源IP。 - klaxxon
1
那是一个“非因果关系”的论据,原因我已经解释过了。 - user207421
1
@user207421 这种能力绝对是必需的。例如,用于负载测试SNMP,其中单个Linux服务器被赋予约5000个IP地址(10.0.0.1-10.0.19.254),并绑定在0.0.0.0上。当它接收到针对10.0.2.20的SNMP请求时,发送的响应应该源自数据包中的10.0.2.20作为源地址,即使服务器绑定到0.0.0.0 -- 因为如下所述,许多NMS依赖于响应(数据包)中的源地址与请求目标(10.0.2.20)匹配。 - brettw
2个回答

1
我放弃了找一个干净的解决方案,只是在服务器上为每个IP地址使用绑定的DatagramSocket,这可以用于发送具有特定源IP的出站UDP数据包。

0
以下程序演示了您的需求是虚构的。它显示一个数据报包源自绑定到0.0.0.0的DatagramSocket,并且其源地址为127.0.0.1。
public static void main(String[] args) throws IOException
{
    DatagramSocket  ds1 = new DatagramSocket(0);
    int port = ds1.getLocalPort();
    System.out.println(ds1.getLocalAddress());
    DatagramSocket  ds2 = new DatagramSocket();
    byte[] bytes = {0x01};
    SocketAddress sa = new InetSocketAddress("localhost", port);
    DatagramPacket  dp = new DatagramPacket(bytes, 0, bytes.length, sa);
    ds2.send(dp);
    ds1.receive(dp);
    ds2.send(dp);
    ds2.receive(dp);
    System.out.println(dp.getAddress());
}

当然,如果我不在意将哪个源地址放入UDP数据包中。但是我的问题是如何选择源地址。 - klaxxon
但是你没有说明为什么认为你需要这个。其实你不需要。 - user207421
当您接收到UDP数据包时,您可以访问源IP/端口和目标IP/端口。我正在与之通信的服务器(SNMP NMS)正在使用入站数据包的源地址。当我接收UDPm时,我可以访问这两个字段,但是当在绑定到0.0.0.0的套接字上发送时,我希望能够提示/选择要在发送时使用的源地址(从服务器上的多个IP中选择)。 - klaxxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接