2009-09-29 6 views
0

После подключения tcp к серверу я закрываю приложение linux и вызывается Socket.close().tcp-соединение в TIME_WAIT не разрешает повторное подключение, java

Проверка netstat -pant, я вижу, что соединение находится в состоянии TIME_WAIT.

Это не позволяет мне немедленно подключиться к серверу, так как я использую тот же порт для подключения. Вместо этого я должен дождаться соединения с таймаутом статуса TIME_WAIT, прежде чем снова смогу снова подключиться.

Я играл вокруг - без ведома - с помощью методов сокета: set_so_timeout(), set_keepalive(), set_so_linger() и set_reuseaddr() - точное назначение орфографии может быть неправильным в этом сообщении.

Мой вопрос: Как я могу получить соединение из статуса TIME_WAIT, чтобы я мог сразу сделать соединение еще раз?

Пожалуйста, дайте мне знать.

Спасибо, JBU

ответ

5

Самый лучший способ, чтобы получить соединение из TIME_WAIT является (удивительно) ждать :-)

Вот как/IP работает TCP. Сеанс идентифицируется кортежем (sourceIP, sourcePort, destIP, destPort, protocol) и причина, по которой вы не можете повторно использовать его, потому что в нем могут быть пакеты для него по-прежнему в сети.

TIME_WAIT состояние, как правило, в два раза превышает максимальный пакет lifetme и вы должны не быть возился с ним, так что может привести пакеты, чтобы показать из предыдущей сессии (которая будет завинчивать текущей сессии).

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

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

+0

Да, другой порт решает проблему, и я буду использовать это пока. Однако описание метода so_linger выглядит так, что OUGHT работает, если я хочу использовать тот же исходный порт. Я просто не уверен, почему это не так. – jbu

+1

SO_LINGER определенно не рекомендуется. Это поддержка, в лучшем случае, спорадическая на платформах, отличных от BSD. – paxdiablo

+0

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