2016-12-01 3 views
0

Мы разработали приложение Java, которое отправляет несколько дейтаграмм UDP на тот же самый IP-адрес назначения. Очевидно, что порт назначения всегда один и тот же, но мы, похоже, не можем установить, чтобы порт источника оставался неизменным на каждой датаграмме.
Если пакет данных, который мы отправляем, больше, чем MTU, пакет должным образом разделен на один и тот же исходный порт, но как только мы отправляем новый пакет данных, исходный порт изменяет, генерируя новый сеанс брандмауэра (какой сетевой администратор предупредил нас о том, очень плохо из-за количества сеансов, создаваемых приложением).Настройка порта источника на гнездо udp

Сейчас мы посылаем пакеты со следующим утверждением:

Мы пытались несколько подходов, и результат всегда один и тот же, мы не можем, кажется, чтобы быть в состоянии установить порт источника к фиксированная стоимость.

Edit- склеивание фактический код:

private boolean sendImage(byte[] imageData, InetAddress address, 
int port) throws UnknownHostException, SocketException { 

    boolean ret = false; 


    DatagramSocket socket = null; 

    try { 
     socket = new DatagramSocket(); 
     DatagramPacket dp = new DatagramPacket(imageData, imageData.length, address, PUERTO_UDP); 
     socket.send(dp); 
     ret = true; 
    } catch (IOException e) { 
     Main.lanzarExcepcion(e); 
     ret = false; 
    } finally { 
     if (socket != null) { 
      socket.close(); 
     } 
    } 

    return ret; 
} 

Спасибо за ваше время!

+0

hmmm Я предполагаю, что порт изменяется в то время, когда предыдущий сокет UDP не закрыт, поэтому ОС пытается открыть новое соединение, чтобы предыдущий порт еще не был доступен и открывает следующий доступный. Это ваша проблема? потому что я не могу думать о какой-либо другой причине, которая изменяет порт клиента. Также вы могли бы объяснить, что «*, но как только мы отправляем новый пакет данных, который изменяется исходный порт *»? как вы пытаетесь открыть новое соединение? В той же теме? В другом процессе? как вы закрываете UDP-сокет? – AntJavaDev

+0

Также ваша инициализация для класса 'DatagramPacket', не выглядит настолько правильной ...... даже не уверен, что это вообще скомпилировано – AntJavaDev

+0

Способ сохранить его всегда одинаково - всегда отправлять из одного и того же сокета вместо очевидно, создавая новый сокет для каждого запроса. – EJP

ответ

2

Я думаю, что ваша проблема в том, что вы закрываете фактический DatagramSocket вместо повторного использования того же самого и просто вызываете socket.send(DatagramPacket). Если вы не можете держать сокет клиента открытым, то вы могли бы даже определить порт клиентов, как: DatagramSocket clientSocket = new DatagramSocket(9743); поэтому каждый раз, когда вы вызываете новый ClientSocket, он получит тот же порт, или он будет бросать java.net.BindException: Address already in use: Cannot bind

Это не решит сетевые сессии, потому что вы открываете новый UDP-сокет. Кроме того, я подозреваю, что ваша сеть администратор видит предыдущие сеансы, потому что вы не закрывая UDP Sockets на всех, а просто нерест их

+0

Просто попытался открыть объект DatagramSocket и повторно использовать его, просто вызвав socket.send (dp) и закомментировав socket.close() Все еще такое же поведение. Была ли надежда на этот подход, поскольку имеет смысл –

+0

вы не открываете розетку? не могли бы вы также определить порт? – AntJavaDev

+0

Просто удалось заставить его работать, не закрывая сокет и указывая нужный порт, теперь я получаю правильный порт src! –

0

Порт источника - это эфемерный порт, созданный для вас базовой сетевой реализацией. Нет причин устанавливать его на определенный номер порта.

+0

На самом деле я только что написал вам причину, мы едим 2K сеансов на каждого клиента каждые 15 минут из 2M максимальных сеансов ресурсов брандмауэра. Мы находимся в университете с 1700 доступными клиентами, если бы все начали использовать это программное обеспечение, мы оставим брандмауэр неустойчивым. –

+0

@CarlosAlbaladejo Вы пытались использовать один и тот же объект InetSocketAddress для многих UDP-пакетов, вместо того, чтобы создавать новый в UDP-пакете? –

0

Как отметил @AntJavaDev

Решение было:

1.- держите DatagramSocket открытым 2.-pass src port в аргументах 3.-повторно использовать незакрытую DatagramSocket для каждого нового пакета данных в тот же пункт назначения!

Спасибо всем!

Смежные вопросы