Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket.close() 
:(
    Опции темы
Konigsberg
Дата 11.12.2005, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.11.2005
Где: Долгопрудный(МО)

Репутация: нет
Всего: нет



Если при выполнении Socket.close() произошло исключение IOException, считать что соединение завершено или незавершено?
PM MAIL ICQ   Вверх
batigoal
Дата 11.12.2005, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Боюсь, что поведение в этом случае будет неопределенным.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Konigsberg
Дата 11.12.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.11.2005
Где: Долгопрудный(МО)

Репутация: нет
Всего: нет



А чисто теоретически когда может возникнуть это исключение?
PM MAIL ICQ   Вверх
LSD
Дата 11.12.2005, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Вот в этом участке кода происходит реальное закрытие сокета:
Код
    protected void close() throws IOException {
    synchronized(fdLock) {
        if (fd != null || fd1 != null) {
        if (fdUseCount == 0) {
            if (closePending) {
            return;
            }
            closePending = true;
            /*
             * We close the FileDescriptor in two-steps - first the
             * "pre-close" which closes the socket but doesn't
             * release the underlying file descriptor. This operation
             * may be lengthy due to untransmitted data and a long
             * linger interval. Once the pre-close is done we do the
             * actual socket to release the fd.
             */
            try {
                socketPreClose();
            } finally {
                socketClose();
            }
            fd = null;
            fd1 = null;
            return;
        } else {
            /*
             * If a thread has acquired the fd and a close
             * isn't pending then use a deferred close.
             * Also decrement fdUseCount to signal the last
             * thread that releases the fd to close it.
             */
            if (!closePending) {
            closePending = true;
                fdUseCount--;
            socketPreClose();
            }
        }
        }
    }
    }

Методы 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.
PM MAIL WWW   Вверх
Konigsberg
Дата 11.12.2005, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 23.11.2005
Где: Долгопрудный(МО)

Репутация: нет
Всего: нет



LSD, пасиб, буду считать соединение разорванным.
PM MAIL ICQ   Вверх
COVD
Дата 12.12.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Когда вы закрываете сокет на одном конце (например, на сервере ), то другой сокет (например, клиентский) об этом все равно ничего не знает. Закрылся сокет или нет на сервере, клиентский сокет может узнать только при попытке что-то послать на сервер. Если же клиентский сокет только "слушает", то он будет слушать вечно.

Когда вы закрываете соединение (сокет) на одном конце, это не значит, что сокет перед закрытием доложит сокету на другом конце о своей кончине. Он просто тихо помрет или выбросит исключение, но это не связано с состоянием сети. Сокет при закрытии ничего никому не пересылает. Такое мое представление.

Это сообщение отредактировал(а) COVD - 12.12.2005, 17:11
PM MAIL   Вверх
val
Дата 12.12.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: нет
Всего: 7



Цитата
Такое мое представление.


Да, верно, я это проверял на практике.


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
LSD
Дата 12.12.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(COVD @ 12.12.2005, 17:06)
Когда вы закрываете соединение (сокет) на одном конце, это не значит, что сокет перед закрытием доложит сокету на другом конце о своей кончине. Он просто тихо помрет или выбросит исключение, но это не связано с состоянием сети. Сокет при закрытии ничего никому не пересылает. Такое мое представление.

У тебя не правильное представление. Почитай главу 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.
PM MAIL WWW   Вверх
COVD
Дата 12.12.2005, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Если закрыть сокет на сервере во время передачи данных, то клиент об этом узнает, потому что согласно протоколу TCP/IP клиентский сокет подтверждает серверу получение данных, т.е. шлет на сервер подтверждение. Но если порция данных успешно прочитана, и клиентский сокет ждет новую порцию, то может и не дождаться, если серверный сокет помер.

За ссылку спасибо. Там сказано, что сокеты при закрытие друг другу должны посылать FIN. Однако у меня сложилось ощущение, что это не всегда срабатывает. Возможно, зависит от того как сокет помер (компьютер завис вот и не успел сокет доложить по форме?).

Это сообщение отредактировал(а) COVD - 12.12.2005, 23:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.