Java Socket становится непригодным для использования после исключения - PullRequest
2 голосов
/ 09 августа 2011

Проблема

В настольном сетевом приложении при отправке данных в DatagramSocket иногда возникает исключение:

java.net.SocketException: No buffer space available (maximum connections reached?): Datagram send failed

После того, как это исключительное гнездо полностью не используется: оно неничего не получаю и send () висит бесконечно.Тест воспроизведения является тривиальным приложением (create socket, bind, while (true) send ();)

Я могу повторить это поведение в 100% случаев только в Windows, когда моя машина переходит в спящий режим, а затемвернитесь в середину «интенсивного потока данных».

Вопросы: :

  1. нормально ли это поведение для сокетов bsd - выйти из строя послеошибка?или это что-то вроде ошибки WSA?
  2. есть ли какой-либо способ "переустановить" неисправный сокет в рабочее состояние или открытие сокета является единственным решением?
  3. можно ли отличить такие условия отрегулярные ошибки ввода / вывода (т.е. исправимые) после перехвата исключения?
  4. Существуют ли общие рекомендации / рекомендации относительно того, когда я буду вновь открывать сокеты в приложении (я имею в виду: изменен сетевой адрес, режим сна / пробуждения ПК идругие события)

Спасибо!:)

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Сокет вообще невозможно использовать после любого исключения, за исключением SocketTimeoutException.

1 голос
/ 09 августа 2011

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

...