【问题标题】:java udp send from specific IP addressjava udp 从特定 IP 地址发送
【发布时间】:2016-12-04 13:12:25
【问题描述】:

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

【问题讨论】:

  • 为什么? IP 将通过 IP 路由表确定的正确接口正确路由它们,并将该接口的 IP 地址放入传出数据报中。注意你没有。 'Java 代码绑定到 0.0.0.0',你有一个 UDP 套接字绑定到 0.0.0.0。
  • 我发送数据包的系统将使用源IP作为信息,所以我需要从我的本地IP中选择一个特定的源IP。
  • 这是一个不合逻辑的,因为我已经给出了原因。
  • @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 依赖于响应(数据包)中的源地址匹配请求目标的 dest(10.0.2.20)。

标签: java networking udp nio


【解决方案1】:

以下程序表明您的需求是虚构的。它表明源自绑定到 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 数据包中。但是我的问题是选择源地址。
  • 但是你没有说明你为什么认为你需要这个。你没有。
  • 当您收到一个 UDP 数据包时,您可以访问源和目标 IP/端口。我正在与之通信的服务器(SNMP NMS)正在使用入站数据包的源地址。当我收到 UDPm 时,我可以访问这两个字段,但是在绑定到 0.0.0.0 的套接字上发送时,我希望能够提示/选择发送时使用的源地址(来自服务器上的多个 IP)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 2015-02-21
    • 2011-05-16
    • 1970-01-01
    • 2012-07-08
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多