|
|
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2013, 11:57:16 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
schwacdtyjvТаким образом, Socket.close() является безопасным способом вырубать сокет. По крайней мере на Windows. Что и доказывает приведенный выше код. Нет. Но в конце этой статьи написано, что нужно сделать, чтобы закрыть "безопасно" нормально.Что нет? В статье написано, что надо делать shutdown/WSASendDisconnect + socketclose(). Нативный код JVM именно это и делает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. А выставление SO_LINGER говорит о том, что мы готовы (а может быть даже намеренно хотим) закрывать сокет через RST. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2013, 12:12:13 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
shutdown инициирует закрытие соединения. close закрывает дескриптор сокета также инициируя последовательность закрытия соединения, если оно еще не было закрыто. Без положительного значения в SO_LINGER обе функции завершаются сразу же, не дожидаясь получения подтверждений отправленных FIN сегментов. Так что после завершения последовательности вызовов Код: java 1. 2. у приложения нет никаких сведений о том, а были ли доставлены данные, которые мы отправили. В конце этой статьи же написано 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2013, 12:35:01 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
Пропустил (4) для сервера (4) Invokes shutdown(s, SD_SEND) to indicate server has no more data to send. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2013, 12:40:23 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
Я так и не могу понять, к чему вы это пишете. Мы изначально говорили про то, безопасен ли Socket.close(). Так вот, я утверждаю, что безопасен. В доказательство этого я привел нативный код JVM, из которого видно, что на Windows он вызывает WSASendDisconnect + closesocket, что соответствует рекомендациям из MSDN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2013, 12:51:41 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
cdtyjvНа Windows работает нормально. Где именно вылез assert? Что на SocketExample.java:51 строке? Это первый же assert. Вы ключик -ea нигде не забыли при локальном тестировании? А то без него "все работает". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 09:20:45 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
maxkarЭто первый же assert. Вы ключик -ea нигде не забыли при локальном тестировании? А то без него "все работает".Серверный порт поменяйте, он у вас занят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2013, 09:58:07 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
cdtyjvСерверный порт поменяйте, он у вас занят. Зачем? Я никаких исключений из-за занятости не получаю. Серверный сокет нормально поднимается. Клиентский сокет тоже исключений не дает. Если assert'ы не включать, то и какое-то чтение идет (все успешно завершается в этом случае). На этом же порту потом работают другие примеры (естественно, после остановки вашего). Хотя порт я поменял. Как и ожидалось - результат ровно тот же. AssertionError на первом is.available() = 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 09:32:56 |
|
||
|
IO/NIO WTF
|
|||
|---|---|---|---|
|
#18+
maxkar , Ну продебажьте, и выясните, с чем это связано. Очевидно же, что до закрытия даже дело не доходит. В моем случае на рабочей машине не биндился серверный сокет, так как он был занят. Как бы то ни было, вопрос по Socket.close() уже закрыт, нативный код все показал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2013, 09:49:10 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2128468]: |
0ms |
get settings: |
16ms |
get forum list: |
47ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
37ms |
get topic data: |
16ms |
get first new msg: |
11ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 309ms |
| total: | 537ms |

| 0 / 0 |
