У меня есть сервер со многими IP-адресами и UDP-сокет, привязанный к 0.0.0.0, поэтому я могу получать UDP от любого из них. Как указать исходный IP-адрес для использования в пакетах UDP, которые я отправляю? В моей текущей реализации используется NIO, поэтому, возможно, использование DatagramChannel для выполнения отправки является проблемой.java udp отправить с определенного IP-адреса
ответ
Следующая программа демонстрирует, что ваше требование является мнимым. Он показывает, что пакет дейтаграммы, возникший с 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());
}
Конечно, если мне было все равно, какой адрес источника был помещен в пакет UDP. Однако мой вопрос состоял в том, чтобы выбрать адрес источника. – klaxxon
Но вы не указали, почему думаете, что вам это нужно. Вы этого не сделаете. – EJP
Когда вы получаете UDP-пакет, у вас есть доступ к IP-портам источника и получателя. Сервер, с которым я общаюсь (SNMP NMS), использует исходный адрес входящих пакетов. У меня есть доступ к обоим этим полям, когда я получаю UDPm, но при отправке сокета, привязанного к 0.0.0.0, я надеялся, что сможет указать/выбрать адрес источника (из нескольких IP-адресов на сервере), который будет использоваться при отправке. – klaxxon
я отказался от чистого раствора и использовать только связанное DatagramSocket за IP-адрес на сервере, который может быть использован для отправки UDP с конкретным источником IP для исходящих пакетов.
Почему? IP правильно направит их по правильному интерфейсу, определенному таблицами маршрутизации IP, и поместит IP-адрес этого интерфейса в исходящую дейтаграмму. NB У вас нет. «Java-код, привязанный к 0.0.0.0», у вас есть UDP-сокет, привязанный к 0.0.0.0. – EJP
Система, по которой я отправляю пакеты, будет использовать исходный IP как информацию, поэтому мне нужно выбрать конкретный IP-адрес источника из локальных IP-адресов. – klaxxon
Это * non sequitur * по той причине, которую я уже дал. – EJP