-
Наверняка такой вопрос уже был, но на нашел здесь простого решения.
Вопрос вот в чём - при использовании Firebird как проверить наличие самого SQL-сервера на удаленной машине, не подключаясь к ней при этом ?
Наверное нужно послать какую-то последовательность на порт 3050 и как-то трактовать ответ - но вот какую и как ?
-
послать не подключаясь можно только мыслепередачей.
только боюсь и в этом случае все равно подключаться придется.
-
> не подключаясь к ней при этом
противоречит
> послать какую-то последовательность на порт 3050 и
> как-то трактовать ответ
-
> Вопрос вот в чём - при использовании Firebird как проверить
> наличие самого SQL-сервера на удаленной машине, не подключаясь
> к ней при этом ?
Спросить у админа.
А если серьезно, то у мну крутиться три сервера FB2.1 Stable, снапшот FB2.5 и еще вражеский InterBase2009 для изучения. И все на разных портах, и ни один при этом на стандартном 3050.
-
> Сергей М. © (22.06.09 10:51) [2]
> противоречит
> > послать какую-то последовательность на порт 3050 и
> > как-то трактовать ответ
Нисколечки.
А если так - не подключаясь к ней стандартными компонентами, а именно:
IBDatabase.Open();
Иди же посылание любой последовательности в порт обязательно приводит к подключению ? Даже телнетом ?
-
ты сам-то как думаешь?
что телнет телепатическим каналом пользуется?
-
> Нисколечки
Оч даже "сколечки".
Подключение есть ничто иное как акт инф.обмена.
Акт инф.обмена есть ничто иное как последовательность действий "отправка запроса - прием ответа на запрос"
-
> Сергей М. © (22.06.09 11:08) [6]
> Акт инф.обмена есть ничто иное как последовательность действий "отправка запроса - прием ответа на запрос"
Так меня интересует именно этот акт обмена :)
Только не тот акт в котором нужно указывать, что нужно подключиться к базе данных, лежащей по определённому пути - а тот акт, который бы свидетельствовал о самом наличии на указанном хосте нужного нам SQL-сервера Firebird...
-
еще одна сказка про белого бычка.
постов на сотню
-
> PEAKTOP © (22.06.09 10:59) [3]
> А если серьезно, то у мну крутиться три сервера FB2.1 Stable, снапшот FB2.5 и еще вражеский InterBase2009 для изучения. И все на разных портах, и ни один при этом на стандартном 3050.
Ведь сами признали что порт 3050 = стандартный.
При таких познаниях, да еще от учасника Firebird Foundation наверняка можно ожидать и более содержательный ответ :)
-
try
idTCPClient1.Open;
except
ShowMessage('упс....')
end;
try
IBDatabase.Open();
except
ShowMessage('тоже упс...')
end;
Вопрос: зачем тебе первый "упс" ?
-
> меня интересует именно этот акт обмена
> который бы свидетельствовал о самом наличии на указанном
> хосте нужного нам SQL-сервера Firebird
Этим как раз и занимается IBDatabase.Open.
Какой еще велосипед ты собрался изобретать - не понятно..
-
> Сергей М. © (22.06.09 11:57) [11]
> Этим как раз и занимается IBDatabase.Open.
> Какой еще велосипед ты собрался изобретать - не понятно.
Да не нужно мне открывать базу данных, понимаете.
И логиниться не нужно и данных оттудова не нужно накаких получать, этим если и будет заниматься - то совсем другое приложение.
Единственное что нужно, так это выяснить - отвечает ли по порту 3050 firebird нужной нам версии или вообще хоть какой-нибудь - или не отвечает.
Уточню вопрос: вопрос звучит - как, а не зачем :)
-
IBServerProperties знает все ответы на все твои вопросы
-
> Сергей М. © (22.06.09 11:57) [11]
Вот такая аналогия родилась...
Припустим нам нужно обойти кваритиры в подъезде по определённому списку и узнать, есть ли кто дома.
Для этого нам не нужно заходить в каждую квартиру, представлятся и т.п.
Достаточно будет позвонить/постучать в дверь, и если спросят "Кто там" пойти дальше...
PS: Если вдруг там залает собака - значит это другой SQL-сервер :)
-
а что, ибдатабэйс после коннекта обязательно обязан вытянуть на клиента все данные всех баз которые на нем есть?
-
> b/@. © (22.06.09 12:09) [12]
Ну возьми сниффер да посмотри как там выглядит рукопожатие
-
> b/@. © (22.06.09 12:20) [14]
То что в ответ на твой стук в дверь соседа за дверью тишина, еще не говорит от том что дома нет никто
-
> Сергей М. © (22.06.09 12:25) [16]
> Ну возьми сниффер да посмотри как там выглядит рукопожатие
Спасибо.
Такая идея была изначально - просто надеялся, что может кто-либо это уже делал до нас.
Вот только взять могу только издому. На работе запрещена скачка *.exe и архивов :(
-
> можно ожидать и более содержательный ответ
Локально - нет проблем. Ни для Windows, ни для LINUX, ни для FreeBSD. В том числе и полный список серверов, работающих на разных портах. Способов - уйма, начиная от скана служб (демонов), скана семафоров, и заканчивая тупым поиском по жесткому диску.
А теперь представьте себе удаленную машину, на которой "где-то висит сетевая служба (демон)". У меня, как у админа по совместительству моих клиентов сразу ряд вопросов:
1) Какой порт она слушает ? - какой захотелось левой пятке админа при установке Firebird.
А как узнать ? - ну, можно перебирать сниффером порты, например.
Ладно, уговорили, допустим слушает стандартный 3050.
2) А прописаны ли в Firewall права для этой службы (демона) принимать подключения от сетевого адреса, не входящего в контрольный список ? Сниффер из п. №1 идет лесом. Даже если Вы знаете полный путь к БД, все равно при подключении вы идете туда же.
Значит, сервера для Вас нет.
3) А не является ли Firebird на этой машине всего-лишь проксирующим демоном для редиректа на настоящий сервер ? Конечно, мы можем узнать об этом из строки подключения к БД... хотя стоп. Какая строка подключения к БД, ведь мы пока лишь проверяем наличие сервера. Который может быть всего лишь проксей для балансировки нагрузки на настоящий сервер.
Это мы еще до варианта самостоятельной сборки Firebird из сырцов не дошли. :)
-
И все-таки вопрос : нафига стучать в дверь ?)
Ну ответил тебе сосед из-за двери "Кто там ?", и что ?
Ответить "Сто грамм", чтобы тебе открыли дверь, прямо сейчас ты не сможешь, тебе ж еще в ларек нужно сбегать за пузырьком - не с пустыми же руками в гости ходить)
А прибежав из ларька с пузырьком ты обнаружишь, что на тот же стук никакого "ктотама" из-за двери не слышно - соседа срочно приспичило уйти по своим делам)
-
щас по итогу окажется, что все это надо только для того, чтобы в случае если тама никого нет, но должно быть, - получить письмо, подойти к машине и мышкой запустить упавший сервис.
а других путей конечно же нет.
ну или он хочет собрать статистику доступности в сети серверов за год.
и продать ее исследователям.
-
> PEAKTOP © (22.06.09 12:36) [19]
У нас нет таких сложных случаев.
Если Firebird-сервер работает, то он работает на порту по-умолчанию, без файрволлов, проксей и т.п.
> Сергей М. © (22.06.09 12:39) [20]
Это своеобразный агент для автонастройки клиента. Сам клиент тяжелый, да и ждать пока истечет таймаут у
IBDatabase.Open();
тоже не хочеться.
Но серверов может быть несколько, и т.к. клиент работает только на чтение из БД, то к какому из серверов подключаться без разницы. Нужно определить первый в списке из ответивших, и уже для него запускать клиента.
-
таймаут-то большой не от того, что сервер долго думает, а от того, что в строке подключения имя хоста а не адрес, а хост выключен.
-
то есть твоя мудрая проверка самописным классом даст точно такой же таймаут.
-
> b/@. © (22.06.09 12:51) [22]
Тогда вполне достаточной будет попытка коннекта к 3050-му порту без акта прикл.обмена.
Если на этом порту хоть кто-то слушает, т.е попытка коннекта по трансп.протоколу была успешной, следом можно пытаться выполнить IBDatabase.Open, т.е. попытку коннекта по прикл.протоколу.
Если там слушает кто угодно, но не FB-сервер, IBDatabase.Open тут же возбудит соотв.исключение.
-
от торомозов резолва, если виноват он, это не поможет.
-
> от торомозов резолва
Ну это отдельная песня, никак не связанная с изнач.вопросом
-
> Это своеобразный агент для автонастройки клиента. Сам клиент
> тяжелый, да и ждать пока истечет таймаут у IBDatabase.Open();
> тоже не хочеться.
Незафигом ждать истечения таймаута, вместо того чтоб послать запрос на следующий адрес.