Конференция "Базы" » Как проверить наличие SQL-сервера Firebird ? [D7, IB6.x]
 
  • b/@. © (22.06.09 10:23) [0]
    Наверняка такой вопрос уже был, но на нашел здесь простого решения.

    Вопрос вот в чём - при использовании Firebird как проверить наличие самого SQL-сервера на удаленной машине, не подключаясь к ней при этом ?

    Наверное нужно послать какую-то последовательность на порт 3050 и как-то трактовать ответ - но вот какую и как ?
  • Медвежонок Пятачок © (22.06.09 10:24) [1]
    послать не подключаясь можно только мыслепередачей.
    только боюсь и в этом случае все равно подключаться придется.
  • Сергей М. © (22.06.09 10:51) [2]

    > не подключаясь к ней при этом


    противоречит


    > послать какую-то последовательность на порт 3050 и
    > как-то трактовать ответ
  • PEAKTOP © (22.06.09 10:59) [3]
    > Вопрос вот в чём - при использовании Firebird как проверить
    > наличие самого SQL-сервера на удаленной машине, не подключаясь
    > к ней при этом ?


    Спросить у админа.

    А если серьезно, то у мну крутиться три сервера FB2.1 Stable, снапшот FB2.5 и еще вражеский InterBase2009 для изучения.  И все на разных портах, и ни один при этом на стандартном 3050.
  • b/@. © (22.06.09 11:00) [4]

    > Сергей М. ©   (22.06.09 10:51) [2]
    > противоречит
    > > послать какую-то последовательность на порт 3050 и
    > > как-то трактовать ответ


    Нисколечки.

    А если так - не подключаясь к ней стандартными компонентами, а именно:
    IBDatabase.Open();



    Иди же посылание любой последовательности в порт обязательно приводит к подключению ? Даже телнетом ?
  • Медвежонок Пятачок © (22.06.09 11:01) [5]
    ты сам-то как думаешь?
    что телнет телепатическим каналом пользуется?
  • Сергей М. © (22.06.09 11:08) [6]

    > Нисколечки


    Оч даже "сколечки".

    Подключение есть ничто иное как акт инф.обмена.
    Акт инф.обмена есть ничто иное как последовательность действий "отправка запроса - прием ответа на запрос"
  • b/@. © (22.06.09 11:12) [7]

    > Сергей М. ©   (22.06.09 11:08) [6]
    > Акт инф.обмена есть ничто иное как последовательность действий "отправка запроса - прием ответа на запрос"

    Так меня интересует именно этот акт обмена :)

    Только не тот акт в котором нужно указывать, что нужно подключиться к базе данных, лежащей по определённому пути - а тот акт, который бы свидетельствовал о самом наличии на указанном хосте нужного нам SQL-сервера Firebird...
  • Медвежонок Пятачок © (22.06.09 11:13) [8]
    еще одна сказка про белого бычка.
    постов на сотню
  • b/@. © (22.06.09 11:20) [9]

    > PEAKTOP ©   (22.06.09 10:59) [3]
    > А если серьезно, то у мну крутиться три сервера FB2.1 Stable, снапшот FB2.5 и еще вражеский InterBase2009 для изучения.  И все на разных портах, и ни один при этом на стандартном 3050.

    Ведь сами признали что порт 3050 = стандартный.
    При таких познаниях, да еще от учасника Firebird Foundation наверняка можно ожидать и более содержательный ответ :)
  • Медвежонок Пятачок © (22.06.09 11:33) [10]
    try
    idTCPClient1.Open;
    except
    ShowMessage('упс....')
    end;

    try
    IBDatabase.Open();
    except
    ShowMessage('тоже упс...')
    end;

    Вопрос: зачем тебе первый "упс" ?
  • Сергей М. © (22.06.09 11:57) [11]

    > меня интересует именно этот акт обмена


    > который бы свидетельствовал о самом наличии на указанном
    > хосте нужного нам SQL-сервера Firebird


    Этим как раз и занимается IBDatabase.Open.
    Какой еще велосипед ты собрался изобретать - не понятно..
  • b/@. © (22.06.09 12:09) [12]

    > Сергей М. ©   (22.06.09 11:57) [11]
    > Этим как раз и занимается IBDatabase.Open.
    > Какой еще велосипед ты собрался изобретать - не понятно.

    Да не нужно мне открывать базу данных, понимаете.
    И логиниться не нужно и данных оттудова не нужно накаких получать, этим если и будет заниматься - то совсем другое приложение.

    Единственное что нужно, так это выяснить - отвечает ли по порту 3050 firebird нужной нам версии или вообще хоть какой-нибудь - или не отвечает.

    Уточню вопрос: вопрос звучит - как, а не зачем :)
  • Медвежонок Пятачок © (22.06.09 12:12) [13]
    IBServerProperties знает все ответы на все твои вопросы
  • b/@. © (22.06.09 12:20) [14]

    > Сергей М. ©   (22.06.09 11:57) [11]

    Вот такая аналогия родилась...

    Припустим нам нужно обойти кваритиры в подъезде по определённому списку и узнать, есть ли кто дома.

    Для этого нам не нужно заходить в каждую квартиру, представлятся и т.п.
    Достаточно будет позвонить/постучать в дверь, и если спросят "Кто там" пойти дальше...

    PS: Если вдруг там залает собака - значит это другой SQL-сервер :)
  • Медвежонок Пятачок © (22.06.09 12:25) [15]
    а что, ибдатабэйс после коннекта обязательно обязан вытянуть на клиента все данные всех баз которые на нем есть?
  • Сергей М. © (22.06.09 12:25) [16]

    > b/@. ©   (22.06.09 12:09) [12]


    Ну возьми сниффер да посмотри как там выглядит рукопожатие
  • Сергей М. © (22.06.09 12:27) [17]

    > b/@. ©   (22.06.09 12:20) [14]


    То что в ответ на твой стук в дверь соседа за дверью тишина, еще не говорит от том что дома нет никто
  • b/@. © (22.06.09 12:29) [18]

    > Сергей М. ©   (22.06.09 12:25) [16]
    > Ну возьми сниффер да посмотри как там выглядит рукопожатие


    Спасибо.

    Такая идея была изначально - просто надеялся, что может кто-либо это уже делал до нас.
    Вот только взять могу только издому. На работе запрещена скачка *.exe и архивов :(
  • PEAKTOP © (22.06.09 12:36) [19]
    > можно ожидать и более содержательный ответ

    Локально - нет проблем. Ни для Windows, ни для LINUX, ни для FreeBSD. В том числе и полный список серверов, работающих на разных портах. Способов - уйма, начиная от скана служб (демонов), скана семафоров, и заканчивая тупым поиском по жесткому диску.

    А теперь представьте себе удаленную машину, на которой "где-то висит сетевая служба (демон)". У меня, как у админа по совместительству моих клиентов сразу ряд вопросов:
    1) Какой порт она слушает ?  - какой захотелось левой пятке админа при установке Firebird.
    А как узнать ? - ну, можно перебирать сниффером порты, например.
    Ладно, уговорили, допустим слушает стандартный 3050.

    2) А прописаны ли в Firewall права для этой службы (демона) принимать подключения от сетевого адреса, не входящего в контрольный список ? Сниффер из п. №1 идет лесом. Даже если Вы знаете полный путь к БД, все равно при подключении вы идете туда же.
    Значит, сервера для Вас нет.

    3) А не является ли Firebird на этой машине всего-лишь проксирующим демоном для редиректа на настоящий сервер ? Конечно, мы можем узнать об этом из строки подключения к БД... хотя стоп. Какая строка подключения к БД, ведь мы пока лишь проверяем наличие сервера. Который может быть всего лишь проксей для балансировки нагрузки на настоящий сервер.

    Это мы еще до варианта самостоятельной сборки Firebird из сырцов не дошли. :)
  • Сергей М. © (22.06.09 12:39) [20]
    И все-таки вопрос : нафига стучать в дверь ?)

    Ну ответил тебе сосед из-за двери "Кто там ?", и что ?

    Ответить "Сто грамм", чтобы тебе открыли дверь, прямо сейчас ты не сможешь, тебе ж еще в ларек нужно сбегать за пузырьком - не с пустыми же руками в гости ходить)

    А прибежав из ларька с пузырьком ты обнаружишь, что на тот же стук никакого "ктотама" из-за двери не слышно - соседа срочно приспичило уйти по своим делам)
  • Медвежонок Пятачок © (22.06.09 12:48) [21]
    щас по итогу окажется, что все это надо только для того, чтобы в случае если тама никого нет, но должно быть, - получить письмо, подойти к машине и мышкой запустить упавший сервис.

    а других путей конечно же нет.

    ну или он хочет собрать статистику доступности в сети серверов за год.
    и продать ее исследователям.
  • b/@. © (22.06.09 12:51) [22]

    > PEAKTOP ©   (22.06.09 12:36) [19]

    У нас нет таких сложных случаев.
    Если Firebird-сервер работает, то он работает на порту по-умолчанию, без файрволлов, проксей и т.п.


    > Сергей М. ©   (22.06.09 12:39) [20]

    Это своеобразный агент для автонастройки клиента. Сам клиент тяжелый, да и ждать пока истечет таймаут у
    IBDatabase.Open();

    тоже не хочеться.
    Но серверов может быть несколько, и т.к. клиент работает только на чтение из БД, то к какому из серверов подключаться без разницы. Нужно определить первый в списке из ответивших, и уже для него запускать клиента.
  • Медвежонок Пятачок © (22.06.09 12:56) [23]
    таймаут-то большой не от того, что сервер долго думает, а от того, что в строке подключения имя хоста а не адрес, а хост выключен.
  • Медвежонок Пятачок © (22.06.09 12:58) [24]
    то есть твоя мудрая проверка самописным классом даст точно такой же таймаут.
  • Сергей М. © (22.06.09 13:02) [25]

    > b/@. ©   (22.06.09 12:51) [22]


    Тогда вполне достаточной будет попытка коннекта к 3050-му порту без акта прикл.обмена.

    Если на этом порту хоть кто-то слушает, т.е попытка коннекта по трансп.протоколу была успешной, следом можно пытаться выполнить IBDatabase.Open, т.е. попытку коннекта по прикл.протоколу.

    Если там слушает кто угодно, но не FB-сервер, IBDatabase.Open тут же возбудит соотв.исключение.
  • Медвежонок Пятачок © (22.06.09 14:02) [26]
    от торомозов резолва, если виноват он, это не поможет.
  • Сергей М. © (22.06.09 14:25) [27]

    > от торомозов резолва


    Ну это отдельная песня, никак не связанная с изнач.вопросом
  • makz (24.06.09 17:08) [28]

    > Это своеобразный агент для автонастройки клиента. Сам клиент
    > тяжелый, да и ждать пока истечет таймаут у IBDatabase.Open();
    >  тоже не хочеться.

    Незафигом ждать истечения таймаута, вместо того чтоб послать запрос на следующий адрес.
 
Конференция "Базы" » Как проверить наличие SQL-сервера Firebird ? [D7, IB6.x]
Есть новые Нет новых   [134473   +33][b:0][p:0.001]