setSoTimeout на клиентском сокете не влияет на сокет - PullRequest
1 голос
/ 20 августа 2009

У меня есть Java-приложение с тремя потоками, которые открывают, каждый, сокет и подключаются к серверу через разные порты. Я устанавливаю so_timeout для каждого из этих сокетов после того, как соединение с сервером установлено. После этого потоки блокируют ожидание чтения (). Только один из потоков истекает через 20 секунд (это тайм-аут, который я установил). Два других игнорируют тайм-аут. Возможно ли, что уровень TCP обрабатывает только один тайм-аут за один раз? Есть ли другое объяснение?

Ответы [ 2 ]

3 голосов
/ 21 августа 2009

В прошлом у меня было несколько проблем, связанных с SO_TIMEOUT в Windows. Я полагаю, что установка этого параметра «предполагается» для установки базовой реализации сокета, которая может зависеть от ОС и конфликтовать с настройками реестра и т. Д.

Мой совет: не использовать SO_TIMEOUT, чтобы вызвать выброшенное исключение по таймауту. Используйте неблокирующий ввод-вывод или убедитесь, что у вас есть доступные байты (), прежде чем читать ().

3 голосов
/ 20 августа 2009

Документация гласит:

Эта опция должна быть включена до начала операции блокировки, чтобы иметь эффект.

возможно, вам следует установить до установления соединения с сервером, по крайней мере, перед вызовом read () в сокете.
Но трудно сказать без кода ...

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