Обработка недоступных портов UDP с помощью сокетов Java - PullRequest
2 голосов
/ 14 ноября 2011

Я использую Java DatagramSocket для потоковой передачи данных нескольким различным клиентам.Поскольку я сам обрабатываю список зарегистрированных на данный момент клиентов, я только привязываю сокет к порту сервера и не подключаюсь к какому-либо конкретному клиенту.

Однако, не используя connect (), я теряю способностьDatagramSocket для реагирования на ICMP-уведомления о недоступном порте, которые отправляются, если один из клиентов умирает и не получает возможности должным образом отменить регистрацию на сервере.

Есть ли способ вернуть такое поведение обратно?Я думал об использовании одного DatagramSocket для каждого клиента, но это не представляется возможным, поскольку все они должны были бы быть связаны с одним и тем же портом на сервере (насколько я знаю, это невозможно в UDP).

Я знаю, что нет никакой гарантии, что мой сервер когда-либо увидит сообщения ICMP, и я реализую некоторый механизм тайм-аута для обработки этого, но реакция на сообщения ICMP позволила бы мне немедленно прекратить передачу на любой хост, который неклиент не запущен, что, по-видимому, неплохо для пользователей потокового клиента.

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Если вам нужны надежные соединения точка-точка, я бы использовал TCP.

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

0 голосов
/ 15 ноября 2011

Причина, по которой он генерируется только подключенными UDP-сокетами, заключается в том, что именно так он работает на уровне 'C', и причина для в том, что заключается в том, что, будучи асинхронным, нет другого способа сказать какой целевой адрес вызвал это, потому что все, что у вас есть на уровне 'C' - это errno, а не содержимое самого сообщения ICMP. Таким образом, чтобы «вернуть поведение», вам действительно понадобится сокет для каждого подключенного клиента. Если это нецелесообразно, вам просто нужно полагаться на наличие или отсутствие ACK приложений.

...