2012-03-21 2 views
1

У меня есть клиент, которому необходимо прослушивать конкретный порт для входящих сообщений широковещательной передачи UDP. Я выполняю это путем инициализации объекта DatagramSocket, привязанного к порту, с помощью setSoTimeout 1500 мс.Java DatagramSocket перестает отвечать на тяжелую нагрузку на сеть

while (true) { 
    try{ 
     DatagramSocket datagramSocket = new DatagramSocket(PORT); 

     byte[] buffer = new byte[BUFF_LEN]; 
     DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 

     datagramSocket.receive(packet); 

     [handoff packet to internal buffer to await processing] 

    } catch (SocketTimeoutException timeout) { 
     ... 
    } catch [other exceptions] 
} 

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

Копаем дальше, я обнаружил, что таймаут запускался каждый раз, когда вызывался .receive(), почти так, как будто ничего не прибывало на порт. Однако работа Wireshark на той же машине показывает, что это неверно, и хорошо сформированные пакеты ожидаемого размера и контента поступают как обычно. Каким-то образом дейтаграммы просто не находили пути к прикладному уровню.

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

Может кто-нибудь пролить свет на то, что может быть проблемой здесь, или что я могу сделать дальше для устранения этой проблемы?

Большое спасибо.

ответ

1

UDP защита от наводнений на программном брандмауэре, возможно?

Кроме того, UDP является ненадежным протоколом по дизайну. Возможно, сетевой уровень отбрасывает пакеты из-за загрузки.

+0

Может ли это быть так, если wirehark регистрирует входящие данные просто отлично? Часы Гуглинга появляются только у одного парня, у которого такая же проблема, как и я - только его условия запуска разные. http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary

+0

Если честно, я не знаю. Вы могли бы использовать фол драйверов, жуткий сетевой карты, смешную версию ОС или что-то еще. Учитывая, что ваш является связанным с нагрузкой и воспроизводимым, и не зная, как Wireshark действительно считывает данные, я бы сказал, что это скорее всего какое-то брандмауэр или дросселирование. – mcfinnigan

0

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

0

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

+0

кричит. Я обвиняю свой псевдокод. Фактический код определяет сокет один раз. Спасибо, что так или иначе указали на это. – Gary

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