В чем разница между вызовом setSoLinger со значением 0 и не включением soLinger вообще? - PullRequest
4 голосов
/ 12 марта 2012

Есть ли в Java разница между установкой сокета с помощью Socket.setSoLinger (true, 0) и вообще без вызова setSoLinger? Есть ли разница в том, как закрыта розетка?

Я просмотрел исходные коды Java и не вижу ничего особенного в том, что касается закрытия сокетов в отношении soLinger. Это наводит меня на мысль, что это специфическое поведение ОС. В моем случае я работаю на Linux.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Socket.setSoLinger(true, 0) на самом деле по умолчанию, поэтому нет никакой разницы.Однако см. Также ответ Заки, почему даже ненулевое значение бесполезно в Java.Socket.close() игнорирует errno, который генерируется по истечении времени ожидания.Я указал на эту проблему около десяти лет назад и получил ответ, что ее нельзя изменить по причинам обратной совместимости.Я не согласен на самом деле, но вы идете.Однако материал NIO2 в Java 7 распознает этот случай и правильно генерирует исключение.

1 голос
/ 12 марта 2012

Когда тайм-аут задан с помощью setSoLinger(), close() блоков до тех пор, пока не будет завершено рукопожатие, или пока не пройдет указанное количество времени.

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

Другими словами, setSoLinger() не предоставляет никаких дополнительных гарантий для приложения в текущих реализациях.

Вот источник информации.

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