![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Konigsberg |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.11.2005 Где: Долгопрудный(МО) Репутация: нет Всего: нет |
Если при выполнении Socket.close() произошло исключение IOException, считать что соединение завершено или незавершено?
|
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 2 Всего: 151 |
Боюсь, что поведение в этом случае будет неопределенным.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
Konigsberg |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.11.2005 Где: Долгопрудный(МО) Репутация: нет Всего: нет |
А чисто теоретически когда может возникнуть это исключение?
|
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Вот в этом участке кода происходит реальное закрытие сокета:
Методы socketPreClose() и socketClose() в итоге обращаются к нативному методу private native void socketClose0(boolean), вот он и может выкинуть ошибку (больше там вроде ничего ее не выкидывает). Как я понимаю там идет обращение к ОС, и одназначно сказать какая ОС какую ошибку выкинет нельзя. Скорее это будет проблема с дескрипторами и т.п. чем проблема с сетью, в результате экспериментов заставить Sockect.close() выкинуть ошибку мне не удалось. Если тебя интересует что делать в таком случае в программе, то я бы советовал ничего не делать, и считать сокет закрытым. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Konigsberg |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.11.2005 Где: Долгопрудный(МО) Репутация: нет Всего: нет |
LSD, пасиб, буду считать соединение разорванным.
|
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Когда вы закрываете сокет на одном конце (например, на сервере ), то другой сокет (например, клиентский) об этом все равно ничего не знает. Закрылся сокет или нет на сервере, клиентский сокет может узнать только при попытке что-то послать на сервер. Если же клиентский сокет только "слушает", то он будет слушать вечно.
Когда вы закрываете соединение (сокет) на одном конце, это не значит, что сокет перед закрытием доложит сокету на другом конце о своей кончине. Он просто тихо помрет или выбросит исключение, но это не связано с состоянием сети. Сокет при закрытии ничего никому не пересылает. Такое мое представление. Это сообщение отредактировал(а) COVD - 12.12.2005, 17:11 |
|||
|
||||
val |
|
|||
![]() Program developer ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 992 Регистрация: 14.1.2003 Где: г. Киев Репутация: нет Всего: 7 |
Да, верно, я это проверял на практике. -------------------- Терпимость - величайшее благо человечества... Ярчайший признак интеллекта – постоянно хорошее настроение… |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
У тебя не правильное представление. Почитай главу 3.5. Closing a Connection в RFC793 (русская версия). Попробуй на клиенте открыть поток и читать из него данные, а на сервере закрыть его. Ты сразу получишь на клиенте end of stream. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Если закрыть сокет на сервере во время передачи данных, то клиент об этом узнает, потому что согласно протоколу TCP/IP клиентский сокет подтверждает серверу получение данных, т.е. шлет на сервер подтверждение. Но если порция данных успешно прочитана, и клиентский сокет ждет новую порцию, то может и не дождаться, если серверный сокет помер.
За ссылку спасибо. Там сказано, что сокеты при закрытие друг другу должны посылать FIN. Однако у меня сложилось ощущение, что это не всегда срабатывает. Возможно, зависит от того как сокет помер (компьютер завис вот и не успел сокет доложить по форме?). Это сообщение отредактировал(а) COVD - 12.12.2005, 23:59 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |