2016-11-30 5 views
-1

У меня есть сервер со многими IP-адресами и UDP-сокет, привязанный к 0.0.0.0, поэтому я могу получать UDP от любого из них. Как указать исходный IP-адрес для использования в пакетах UDP, которые я отправляю? В моей текущей реализации используется NIO, поэтому, возможно, использование DatagramChannel для выполнения отправки является проблемой.java udp отправить с определенного IP-адреса

+2

Почему? IP правильно направит их по правильному интерфейсу, определенному таблицами маршрутизации IP, и поместит IP-адрес этого интерфейса в исходящую дейтаграмму. NB У вас нет. «Java-код, привязанный к 0.0.0.0», у вас есть UDP-сокет, привязанный к 0.0.0.0. – EJP

+0

Система, по которой я отправляю пакеты, будет использовать исходный IP как информацию, поэтому мне нужно выбрать конкретный IP-адрес источника из локальных IP-адресов. – klaxxon

+1

Это * non sequitur * по той причине, которую я уже дал. – EJP

ответ

1

Следующая программа демонстрирует, что ваше требование является мнимым. Он показывает, что пакет дейтаграммы, возникший с DatagramSocket, привязанный к 0.0.0.0, поставляется с адресом источника 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()); 
} 
+0

Конечно, если мне было все равно, какой адрес источника был помещен в пакет UDP. Однако мой вопрос состоял в том, чтобы выбрать адрес источника. – klaxxon

+0

Но вы не указали, почему думаете, что вам это нужно. Вы этого не сделаете. – EJP

+0

Когда вы получаете UDP-пакет, у вас есть доступ к IP-портам источника и получателя. Сервер, с которым я общаюсь (SNMP NMS), использует исходный адрес входящих пакетов. У меня есть доступ к обоим этим полям, когда я получаю UDPm, но при отправке сокета, привязанного к 0.0.0.0, я надеялся, что сможет указать/выбрать адрес источника (из нескольких IP-адресов на сервере), который будет использоваться при отправке. – klaxxon

-2

я отказался от чистого раствора и использовать только связанное DatagramSocket за IP-адрес на сервере, который может быть использован для отправки UDP с конкретным источником IP для исходящих пакетов.