powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / IO/NIO WTF
10 сообщений из 85, страница 4 из 4
IO/NIO WTF
    #38417998
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/en-us/library/windows/desktop/ms738547(v=vs.85).aspx

Вот этой статье.
авторOne technique that can be used to minimize the chance of problems occurring during connection teardown is to avoid relying on an implicit shutdown being initiated by closesocket. Instead, use one of the two explicit shutdown functions, shutdown or WSASendDisconnect. This in turn causes an FD_CLOSE indication to be received by the peer application indicating that all pending data has been received.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38417999
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwacdtyjvТаким образом, Socket.close() является безопасным способом вырубать сокет. По крайней мере на Windows. Что и доказывает приведенный выше код.
Нет. Но в конце этой статьи написано, что нужно сделать, чтобы закрыть "безопасно" нормально.Что нет? В статье написано, что надо делать shutdown/WSASendDisconnect + socketclose(). Нативный код JVM именно это и делает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
JNIEXPORT int JNICALL NET_SocketClose(int fd) {
    struct linger l;
    int ret;
    nt len = sizeof (l);
    if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (char *)&l, &len) == 0) {
        if (l.l_onoff == 0) {
            WSASendDisconnect(fd, NULL);
        }
    }
    ret = closesocket (fd);
    return ret;
}


А выставление SO_LINGER говорит о том, что мы готовы (а может быть даже намеренно хотим) закрывать сокет через RST.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38418009
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shutdown инициирует закрытие соединения.
close закрывает дескриптор сокета также инициируя последовательность закрытия соединения, если оно еще не было закрыто.
Без положительного значения в SO_LINGER обе функции завершаются сразу же, не дожидаясь получения подтверждений отправленных FIN сегментов.

Так что после завершения последовательности вызовов
Код: java
1.
2.
write(socket, data)
close(socket)


у приложения нет никаких сведений о том, а были ли доставлены данные, которые мы отправили.

В конце этой статьи же написано
http://msdn.microsoft.com/en-us/library/windows/desktop/ms738547(v=vs.85).aspx One technique that can be used to minimize the chance of problems occurring during connection teardown is to avoid relying on an implicit shutdown being initiated by closesocket. Instead, use one of the two explicit shutdown functions, shutdown or WSASendDisconnect. This in turn causes an FD_CLOSE indication to be received by the peer application indicating that all pending data has been received. To illustrate this, the following table shows the functions that would be invoked by the client and server components of an application, where the client is responsible for initiating a graceful shutdown.

Client

(1) Invokes shutdown(s, SD_SEND) to signal end of session and that client has no more data to send.

(local timing significance only) Gets FD_READ and calls recv to get any response data sent by server

Server

(2) Receives FD_CLOSE, indicating graceful shutdown in progress and that all data has been received.

(3) Sends any remaining response data.

(local timing significance only) Invokes closesocket .

Client

(5) Receives FD_CLOSE indication.

(6) Invokes closesocket.

А теперь тоже самое, но для unix
http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38418011
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропустил (4) для сервера
(4) Invokes shutdown(s, SD_SEND) to indicate server has no more data to send.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38418014
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и не могу понять, к чему вы это пишете. Мы изначально говорили про то, безопасен ли Socket.close().
Так вот, я утверждаю, что безопасен. В доказательство этого я привел нативный код JVM, из которого видно, что на Windows он вызывает WSASendDisconnect + closesocket, что соответствует рекомендациям из MSDN.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38418481
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНа Windows работает нормально. Где именно вылез assert? Что на SocketExample.java:51 строке?
Это первый же assert. Вы ключик -ea нигде не забыли при локальном тестировании? А то без него "все работает".
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38418508
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkarЭто первый же assert. Вы ключик -ea нигде не забыли при локальном тестировании? А то без него "все работает".Серверный порт поменяйте, он у вас занят.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38419722
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvСерверный порт поменяйте, он у вас занят.
Зачем? Я никаких исключений из-за занятости не получаю. Серверный сокет нормально поднимается. Клиентский сокет тоже исключений не дает. Если assert'ы не включать, то и какое-то чтение идет (все успешно завершается в этом случае). На этом же порту потом работают другие примеры (естественно, после остановки вашего).

Хотя порт я поменял. Как и ожидалось - результат ровно тот же. AssertionError на первом is.available() = 4.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38419746
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkar ,
Ну продебажьте, и выясните, с чем это связано. Очевидно же, что до закрытия даже дело не доходит. В моем случае на рабочей машине не биндился серверный сокет, так как он был занят.
Как бы то ни было, вопрос по Socket.close() уже закрыт, нативный код все показал.
...
Рейтинг: 0 / 0
IO/NIO WTF
    #38419751
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxkar ,
В моем коде блок catch пуст. Добавьте туда print, и увидите, в чем причина.
...
Рейтинг: 0 / 0
10 сообщений из 85, страница 4 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / IO/NIO WTF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]