TimeOut
TimeOut
FireBird 2.1, Delphi 2009, FIBPlus
При попытке соединения на остановленный или недоступный сервер, необходимо через скажем 5 секунд выдать сообщение. В FibPlus есть свойство Timer но не помогает что-то или я не так понял его значения. Пробую стандартный TTimer .. перед попыткой соединения запускаю его, все равно приложение висит пока не выдаст сообщение сообщение исключение..
При попытке соединения на остановленный или недоступный сервер, необходимо через скажем 5 секунд выдать сообщение. В FibPlus есть свойство Timer но не помогает что-то или я не так понял его значения. Пробую стандартный TTimer .. перед попыткой соединения запускаю его, все равно приложение висит пока не выдаст сообщение сообщение исключение..
Re: TimeOut
....не создавать же отдельный поток для таймера... можно, но может есть путь попроще?
Re: TimeOut
если мне не изменяет память то пока система не отпустит то приложение об этом не узнает. так что это настройка системы. лучше выводи красивое окошко : "пробуем подключится к БД" и пусть ждут.
Re: TimeOut
невозможно это никак. Например, ты в браузере лезешь на сайт. А он недоступен. Происходит пауза, а потом сообщение об ошибке. Так вот, длительностью паузы ты управлять не можешь, и во время паузы с браузером тоже делать ничего не можешь. Здесь то же самое -При попытке соединения на остановленный или недоступный сервер, необходимо через скажем 5 секунд выдать сообщение.
пока сокет операционки не скажет, что на том конце никого нет - твое приложение будет висеть.
Собственно, это не то же самое, это просто одно и то же.
Теоретически можно завести два треда, в одном коннектиться, а в другом сигналы выдавать, но во-первых это как правило глючит (коннект к БД в не главно треде), а во вторых, слишком замутно и сложно. В общем, рюши, которые никому нафиг не сдались.
-
- Сообщения: 144
- Зарегистрирован: 16 фев 2006, 22:36
Re: TimeOut
Доброго времени суток!
Теоретически, в firebird.conf есть параметр ConnectionTimeout, который за это и отвечает. Правда, для соединений на localhost мне не удалось добиться никакого видимого эффекта его изменениями (isql, 2.1.1).kdv писал(а):невозможно это никак. Например, ты в браузере лезешь на сайт. А он недоступен. Происходит пауза, а потом сообщение об ошибке. Так вот, длительностью паузы ты управлять не можешь, и во время паузы с браузером тоже делать ничего не можешь. Здесь то же самое -
пока сокет операционки не скажет, что на том конце никого нет - твое приложение будет висеть.
Собственно, это не то же самое, это просто одно и то же.
Re: TimeOut
он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
-
- Сообщения: 144
- Зарегистрирован: 16 фев 2006, 22:36
Re: TimeOut
Доброго времени суток!
--
С уважением, Евгений
Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения. Да и разработчики на gmane вроде об этом писали.kdv писал(а):он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
--
С уважением, Евгений
Re: TimeOut
Путаешь ConnectionTimeout с DummyPacketIntervalkdv писал(а):он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
Re: TimeOut
на заборе тоже бывает разное написано. Эта запись где? В конфиге сервера. Какое отношение она имеет к клиенту, который стучится к выключенному серверу?Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения.
Почему, например, у меня при попытке коннекта к нестартованному серверу (или к роутеру, где ФБ нет) IBExpert показывает ошибку через 5 секунд, а не через 180? Почему если пытаться законнектиться к ФБ наружу в инет например к http://www.ibase.ru таймаут наступает через 40-60 секунд?
Почему в исходниках на самом деле эта переменная называется port_connect_timeout?
Почему там написано
/* Implement an error-detection protocol to ensure that the client
is still there. Use the select() call with a timeout to wait on
the connection for an incoming packet. If none comes within a
suitable time interval, write a dummy packet on the connection.
If the client is not there, an error will be returned on the write.
Почему вообще этот самый пресловутый таймаут используется в единственном месте inet.cpp
Код: Выделить всё
timeout.tv_sec = port->port_connect_timeout;
time_ptr = &timeout;
...
#if (defined WIN_NT)
slct_count = select(FD_SETSIZE, &slct_fdset, NULL, NULL, time_ptr);
#else
slct_count = select((SOCKET) port->port_handle + 1, &slct_fdset,
NULL, NULL, time_ptr);
ок, путаю.hvlad писал(а):Путаешь ConnectionTimeout с DummyPacketInterval
ConnectionTimeout - допустимое время неответа в существующем (!) коннекте.
DummyPacket - если произошла ошибка по ConnectionTimeout, то клиенту шлется пустой пакет, и если через DummyPacketInterval сервер не получил ответа от клиента, клиент считается отрубившимся. Так?
Ну и наконец. В том же inet.cpp есть функция inet_try_connect. Если я правильно понимаю, то это и есть попытка коннекта к серверу. Если да, то где в ней указание таймаута? Да хоть бы и в inet_connect.
port = inet_try_connect(packet, rdb, file_name, node_name, status_vector, dpb);
(про isc_dpb_connect_timeout я пока промолчу).
Re: TimeOut
Т.е. наш конфиг списан с забора ? Спасибо за сравнение.kdv писал(а):на заборе тоже бывает разное написано.Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения.
У клиента тоже есть конфиг, представь себе. И умолчательные значения вполне имеют силу.kdv писал(а):Эта запись где? В конфиге сервера. Какое отношение она имеет к клиенту, который стучится к выключенному серверу?
Потому что в этом случае до физ. коннекта даже не доходит дело, я так подозреваю. Хочешь узнать точнее - трассируй в отладчике какой из вызовов возвращает ошибку.kdv писал(а):Почему, например, у меня при попытке коннекта к нестартованному серверу (или к роутеру, где ФБ нет) IBExpert показывает ошибку через 5 секунд, а не через 180? Почему если пытаться законнектиться к ФБ наружу в инет например к http://www.ibase.ru таймаут наступает через 40-60 секунд?
Спроси у борландов. Но вообще-то там написано :kdv писал(а):Почему в исходниках на самом деле эта переменная называется port_connect_timeout?
Код: Выделить всё
SLONG port_connect_timeout; /* Connection timeout value */
SLONG port_dummy_packet_interval; /* keep alive dummy packet interval */
SLONG port_dummy_timeout; /* time remaining until keepalive packet */
А чем тебе это не нравится ?kdv писал(а):Почему там написано
/* Implement an error-detection protocol to ensure that the client
is still there. Use the select() call with a timeout to wait on
the connection for an incoming packet. If none comes within a
suitable time interval, write a dummy packet on the connection.
If the client is not there, an error will be returned on the write.
Потому что это единственный вызов в котором можно указать хоть какой-нибудь таймаут.kdv писал(а):Почему вообще этот самый пресловутый таймаут используется в единственном месте inet.cpp
?Код: Выделить всё
timeout.tv_sec = port->port_connect_timeout; time_ptr = &timeout; ... #if (defined WIN_NT) slct_count = select(FD_SETSIZE, &slct_fdset, NULL, NULL, time_ptr); #else slct_count = select((SOCKET) port->port_handle + 1, &slct_fdset, NULL, NULL, time_ptr);
Коннет != сокетkdv писал(а):ок, путаю.hvlad писал(а):Путаешь ConnectionTimeout с DummyPacketInterval
ConnectionTimeout - допустимое время неответа в существующем (!) коннекте.
Почти так. Пакетов шлётся несколько.kdv писал(а):DummyPacket - если произошла ошибка по ConnectionTimeout, то клиенту шлется пустой пакет, и если через DummyPacketInterval сервер не получил ответа от клиента, клиент считается отрубившимся. Так?
inet_try_connect вызывает port->receive, которая вызывает select с таймаутом.kdv писал(а):Ну и наконец. В том же inet.cpp есть функция inet_try_connect. Если я правильно понимаю, то это и есть попытка коннекта к серверу. Если да, то где в ней указание таймаута? Да хоть бы и в inet_connect.
port = inet_try_connect(packet, rdb, file_name, node_name, status_vector, dpb);
Дима, никто не спорит, что ConnectionTimeout реализован криво. Но не нужно говорить, что его нет вообще и не нужно его путать с DummyPacketInterval. До 2.5 классик был однопоточным приложением, со всеми вытекающими.
Когда будем переделывать сетевой слой, переделаем и таймауты, добавим query timeout и т.п.
Угу, и это правильноkdv писал(а):(про isc_dpb_connect_timeout я пока промолчу).
Код: Выделить всё
void REMOTE_get_timeout_params(rem_port* port, Firebird::ClumpletReader* pb)
{
/**************************************
*
* R E M O T E _ g e t _ t i m e o u t _ p a r a m s
*
**************************************
*
* Functional description
* Determine the connection timeout parameter values for this newly created
* port. If the client did a specification in the DPB, use those values.
* Otherwise, see if there is anything in the configuration file. The
* configuration file management code will set the default values if there
* is no other specification.
*
**************************************/
//bool got_dpb_connect_timeout = false;
fb_assert(isc_dpb_connect_timeout == isc_spb_connect_timeout);
port->port_connect_timeout =
pb && pb->find(isc_dpb_connect_timeout) ? pb->getInt() : Config::getConnectionTimeout();
Re: TimeOut
ок. собственно, вся моя речь сводилась к одному - параметр connectiontimeout не имеет отношения к паузе от вызова isc_attach_database до получения сообщения что "сервера на том конце нет". Или если даже и имеет, то весьма частичное.