KeepAlive в клиентском приложении

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Ark
Сообщения: 4
Зарегистрирован: 17 окт 2007, 13:08

KeepAlive в клиентском приложении

Сообщение Ark » 17 окт 2007, 13:26

Имеется многопоточное приложение для репликации данных, которое работает в центральном офисе.
При плохой связи с некоторыми филиалами поток репликации может подвисать из-за длительных обрывов связи.
Сразу хочу уточнить, что проблема НЕ в многопоточности: на каждый поток используется один коннект, подключения к базе сериализованы.
Вопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 окт 2007, 19:29

Вопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
www.ibase.ru/devinfo/keepalive.htm

Ark
Сообщения: 4
Зарегистрирован: 17 окт 2007, 13:08

Сообщение Ark » 19 окт 2007, 17:22

kdv писал(а):
Вопрос в следующем: возможно ли задать параметр KEEPALIVE для клиентского коннекта?
www.ibase.ru/devinfo/keepalive.htm
Я уже читал эту статью.
Насколько я понял, в ней описывается механизм KEEPALIVE для СЕРВЕРА Firebird (серверному сокету устанавливается параметр SO_KEEPALIVE и при обрыве связи с клиентом и длительном ее отсутствии сервер посылает пакеты для проверки активности клиента, и если клиент вовремя не ответил, он освобождает поток (процесс) выделенный для этого клиента)
В моем случае, репликатор является КЛИЕНТОМ Firebird, но при этом выполняет СЕРВЕРНЫЕ ФУНКЦИИ по репликации данных из филиалов.
В связи с этим мне важно, чтобы клиентские коннекты тоже не провисали из-за обрывов связи, т.е. необходимо, чтобы клиентский сокет также создавался с параметром SO_KEEPALIVE и при длительном отсутствии связи с сервером Firebird проверялась активность серверного сокета и при отсутствии ответа закрывался клиентский сокет.
Буду очень признателен, если вы объясните, в чем я не прав ?!
Возможно я неверно понял указанную выше статью ?!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 окт 2007, 10:12

Насколько я понял, в ней описывается механизм
если ты ее ЧИТАЛ, то фраза "насколько я понял" неприменима. Тогда читай еще раз.

Ark
Сообщения: 4
Зарегистрирован: 17 окт 2007, 13:08

Сообщение Ark » 22 окт 2007, 17:57

kdv писал(а):
Насколько я понял, в ней описывается механизм
если ты ее ЧИТАЛ, то фраза "насколько я понял" неприменима. Тогда читай еще раз.
Не надо придираться к фразам !!!
В статье есть единственное упоминание о клиентском коннекте:
Настройка KEEPALIVE в Windows (для клиентов)

Данная настройка необязательна, но, возможно, позволит уменьшить количество сообщений о потере соединения при использовании ненадежных линий связи. Добавьте в ветку реестра

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

параметр DisableDHCPMediaSense=1 . См. описание данного параметра здесь:
http://support.microsoft.com/?scid =kb%3Bru%3B239924&x=13&y=14
Смысл данной настройки абсолютно другой !!!
Если бы у меня базы стояли в локалке, и кто-нибудь периодически выдергивал кабели из серверных компов, мне бы эта настройка помогла.
И то, мне бы всего лишь выдавалась ошибка о разрыве связи, а в моем случае клиент "бесконечно" ожидает ответа от уже не существуюшего серверного сокета.
У меня серверы в разных концах Москвы, и соединение идет через несколько VPN, и если какой-нибудь рабочий перекусит оптику по пути, мне эта настрока ничем не поможет.

У меня сложилось впечатление, что вы не читаете моих вопросов, а увидев слово "KEEPALIVE" стандартно, как и всех остальных, отсылаете на выше указанную статью.
А если вы все же прочитали мой вопрос, дайте на него четкий ответ, а то так можно не один месяц препираться :(

Повторю вопрос еще раз: возможно ли задать параметр KEEPALIVE для КЛИЕНТСКОГО сокета?
Умеет ли библитека gds32 в принципе создавать сокеты с параметром SO_KEEPALIVE?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 окт 2007, 19:42

Не надо придираться к фразам !!!
не надо буйствовать. я когда чего-то не понимаю, беру и еще раз перечитываю, пока понятно не станет. Если непонятно - ищу дополнительную информацию.
а увидев слово "KEEPALIVE" стандартно, как и всех остальных, отсылаете на выше указанную статью.
разумеется, не буду же я ее тут пересказывать. На Вашем нике не написано, что Вы семи пядей во лбу, и в курсе как работает и настраивается механизм keepalive, и Вы не сказали, что читали статью.
А если вы все же прочитали мой вопрос, дайте на него четкий ответ
я кому-то чем-то обязан? Вообще статья про keepalive содержит линк на
How to detetmine loss of client/server connection
http://support.microsoft.com/default.aspx?kbid=140325

если я правильно понял этот линк, настройка относится как к клиенту так и к серверу. Потому что вопрос проверки актуальности соединения (опция keepalive) реализуется стеком tcp.
Умеет ли библитека gds32 в принципе создавать сокеты с параметром SO_KEEPALIVE?
она или умеет или не умеет. какая именно библиотека?

gds32.dll или fbclient.dll?

если первое, то
http://dn.codegear.com/ru/article/30362

если второе, то по идее в inet.cpp есть опция keepalive, но я не уверен, что она относится к клиенту. Сервер однозначно открывает сокет с этой опцией, начиная с FB 1.5.

По поводу клиентов и keepalive есть например статья
http://www.experts-exchange.com/Network ... 10829.html

а в отношении клиента FB давайте лучше подождем, что скажут разработчики FB.
Возможно я неверно понял указанную выше статью ?!
независимо от статьи, release notes по FB не упоминают явно что клиентский коннект открывается с этой опцией.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 22 окт 2007, 22:56

SO_KEEPALIVE не устанавливается клиентом

Ark
Сообщения: 4
Зарегистрирован: 17 окт 2007, 13:08

Сообщение Ark » 23 окт 2007, 12:58

Спасибо за ответы, kdv и hvlad !!!
не надо буйствовать
Извините, если был слишком буйным :)

abracadabra
Сообщения: 4
Зарегистрирован: 26 май 2008, 11:45

Сообщение abracadabra » 26 май 2008, 13:05

искал информацию по теме, и первая ссылка была сюда. Но тут нашел неутешительные ответы. К счастью, на трекере firebird нашел более обнадеживающие известия.

может кому будет полезно
Vlad Khorsun - [21/Mar/08 11:43 AM ]
Client socket for database connection now set TCP_NODELAY option (accordingly to firebird.conf setting, by default on).
Client socket for events processing now set SO_KEEPALIVE option
http://tracker.firebirdsql.org/browse/CORE-1763

Ответить