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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Socket - keepalivetime, keepaliveinterval 
:(
    Опции темы
Logo
Дата 6.12.2012, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



Как в Socket задать параметры для SO_KEEPALIVE? Нахожу в документации только методы getKeepAlive и setKeepAlive, но они задают лишь булево значение.
PM MAIL   Вверх
Logo
Дата 7.12.2012, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



Как определить разрыв соединения?
PM MAIL   Вверх
LSD
Дата 10.12.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Logo @  7.12.2012,  20:27 Найти цитируемый пост)
Как определить разрыв соединения? 

Обычно для это используются heartbeat message.


--------------------
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   Вверх
Logo
Дата 11.12.2012, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



Цитата(LSD @ 10.12.2012,  13:56)
Цитата(Logo @  7.12.2012,  20:27 Найти цитируемый пост)
Как определить разрыв соединения? 

Обычно для это используются heartbeat message.

В TCP соединении уже предусмотрена для этого TCP-keepalive. Вот только возможности задать свои значения tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes из Java никак не нахожу.

Это сообщение отредактировал(а) Logo - 11.12.2012, 17:27
PM MAIL   Вверх
LSD
Дата 11.12.2012, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата
Under Transmission Control Protocol (TCP) keepalives are an optional feature, and if included must default to off.



--------------------
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   Вверх
Logo
Дата 13.12.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



По умолчанию не включена, но ее можно включить, в Java для этого есть setKeepAlive, но опции как задать, не понятно.

Цитата

and if included

Т.е. не все ОС/TCP-клиенты обязаны соблюдать TCP keep-alive? А как дела на практике?
PM MAIL   Вверх
COVD
Дата 13.12.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Встроенная проверка соединения, если включена, осуществляется примерно раз в два часа посылкой heartbeat. Этот период не регулируется и зависит от реализации. Стандарт был заложен давно. На практике такой большой период неопределенности часто не устраивает, поэтому распространенным, простым и переносимым решением является организация проверки соединения в приложении (т.е. не используют keep-alive). Программируют отсылку heartbeat с нужным периодом и его обработку.  
PM MAIL   Вверх
LSD
Дата 13.12.2012, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Logo @  13.12.2012,  14:27 Найти цитируемый пост)
Т.е. не все ОС/TCP-клиенты обязаны соблюдать TCP keep-alive?

Не все реализации TCP стека должны поддерживать такую опцию. На практике Windows и Linux поддерживают.





--------------------
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   Вверх
Logo
Дата 15.12.2012, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



COVD
Вообще-то в C/C++ можно задавать свои значения структуры keep-alive, как в других языках не знаю. А в Java видимо нет(.
Только задать значения через sysctrl, что выглядит как хак,  т.к. влияет на всю систему.
Либо расширять прикладной протокол, что уже несколько сложнее. + Придется, как я понимаю, добавить еще один поток, или переделать на неблокирующие сокеты, т.к. чтение блокирует поток.

PM MAIL   Вверх
COVD
Дата 16.12.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Вообще-то в C/C++ можно задавать свои значения структуры keep-alive

Можно, но это не 100% переносимое решение. На каких-то ОС это было невозможно, наверное. Видимо, поэтому в Java этого нет. С другой стороны, не так много ситуаций, когда это необходимо. В соединениях запрос-ответ достаточно таймаутов на соединение и чтение. В соединениях, где передается непрерывный поток данных, сам факт поступления данных является индикатором исправности соединения, и достаточно таймаута на чтение. И только в случае, когда поток передаваемых данных имеет естественные паузы требуется в эти паузы добавлять heartbeat, чтобы не сработал таймаут на чтение на приемной стороне. Да, для реализации heartbeat может потребоваться дополнительный поток на передающей стороне. Но такое усложнение прикладного протокола не представляется чрезмерным.

Это сообщение отредактировал(а) COVD - 16.12.2012, 18:53
PM MAIL   Вверх
LSD
Дата 17.12.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Кстати есть еще один момент: heartbeat message еще показывает, что сервер/клиент жив. TCP keepalives поддерживается на уровне ОС, и возможна ситуация когда сервер/клиент завис, а keepalive пакеты по прежнему идут.


--------------------
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   Вверх
Logo
Дата 18.12.2012, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

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



Цитата

На каких-то ОС это было невозможно, наверное. Видимо, поэтому в Java этого нет.

А сам keep-alive тем не менее есть, странно...
PM MAIL   Вверх
COVD
Дата 18.12.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Это давняя история и вы можете найти много обсуждений в интернете. Вы не первый, кому представляется странным, что в Java нельзя изменить период встроенного keep-alive. 

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

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

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


 




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


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

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