Как просмотреть / изменить время ожидания сокета в Linux? - PullRequest
9 голосов
/ 26 июня 2009

При создании сокета в Java:

new Socket(host, port);

Конструктор Socket попытается подключиться к хосту: порт перед возвратом. В Windows это происходит почти мгновенно для недоступных хостов, но для Linux может потребоваться до 5 минут, чтобы время ожидания Socket истекло.

Я знаю, что если у меня есть контроль над созданием Сокетов, я могу сделать:

Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);

но я бы предпочел, чтобы ОС использовала разумное значение по умолчанию. Есть ли способ изменить этот параметр в Linux?

Спасибо

Ответы [ 4 ]

9 голосов
/ 26 июня 2009

Я думаю, что вы хотите /proc/sys/net/ipv4/tcp_syn_retries. По умолчанию обычно 5 или 6, что составляет около 3 минут.

Обратите внимание, что это общесистемные.

4 голосов
/ 26 июня 2009

Я бы не советовал менять настройки ОС, поскольку это может неожиданно повлиять на другие приложения Метод Socket.setSoTimeout() тоже может вам помочь.

2 голосов
/ 08 сентября 2011

Кстати, не совсем правильно, что Linux и Windows ведут себя здесь по-разному. Помимо первоначальных повторных попыток SYN (которые могут быть настроены в Linux и Windows), соседнее состояние, а также другие маршрутизаторы, отправляющие пакеты RST, также играют роль.

Если попытка подключения в Windows немедленно завершается неудачей, вероятно, это было более RSTed маршрутизатором, или сосед был признан недоступным на уровне ARP. Попробуйте команду arp -a -v в Windows, чтобы увидеть недоступные хосты, которые быстро отклоняются.

Для Linux вы должны использовать ip neigh для отображения состояния доступности станций в вашей локальной сети.

0 голосов
/ 26 июня 2009

Насколько я понимаю, это зависит от тайм-аута системы по умолчанию TCP / IP (240 секунд по умолчанию?) ... один из вариантов - попытаться настроить их, однако это может повлиять на любые другие программы на той же машине, которые используют значение тайм-аута. В этом случае может быть безопаснее просто уменьшить значение «timeout» в вызове Java connect ().

...