HTTP-сокет закрыт в Linux, но не может открыть его снова - PullRequest
1 голос
/ 12 ноября 2010

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

То есть это выглядит так: 1) Приложение работает нормально, что-то вызывает закрытие сокета. 2) Любые последующие попытки открыть его, включая перезапуск приложения, будут вызывать "java.net.BindException: Адрес уже используется" в течение некоторого времени. 3) Затем он, наконец, разрешит открыть сокет через перезапуск другого приложения.

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

Звонит ли он кому-нибудь?

ОС: 2.6.18-194.el5 # 1 SMP пт 2 апреля 14:58:14 EDT 2010 x86_64, выпуск CentOS 5.5 Версия Java: 1.6.0_20

Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 ноября 2010

Похоже, вы должны сказать Linux, чтобы он создавал сокет с разрешенной немедленной привязкой, см. SO_REUSEADDR в man 7 socket.

0 голосов
/ 13 ноября 2010

Вы не можете выполнить мгновенное повторное связывание, поскольку сокеты задерживаются до тех пор, пока все сообщения в очереди для сокета не будут успешно отправлены или не истечет время ожидания задержки.Вы можете изменить эту политику с помощью SO_LINGER.

Более подробную информацию можно найти здесь (manpage) и здесь (javadoc)

Что касаетсяпроблема закрытия, это похоже на ошибку в вашем коде.

0 голосов
/ 13 ноября 2010

Что касается закрытия сокета, вам придется исследовать ваш код.Это не что-то внешнее, которое закрывает сокет, это может быть только ваш код.

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

Вы можете установить опцию сокета SO_REUSEADDR, чтобы система работала и все равно позволяла программе связываться с этим портом.Для Java см. здесь

0 голосов
/ 13 ноября 2010

Звучит так, будто вы должны исследовать часть «что-то, вызывающее закрытие сокета».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...