Не могу заставить Firebird подключиться к локальному IP-адресу - PullRequest
1 голос
/ 24 марта 2011

У меня странная проблема на нескольких клиентских сайтах с Firebird и .net. Я использую Firebird 2.1 и провайдер DDEX для Visual Studio, и я работаю в C #. В частности, я получаю очень общие исключения:

Exception on trying to connect to firebird DB:
FirebirdSql.Data.FirebirdClient.FbException: Unable to complete network request to host "10.206.34.177". 
---> FirebirdSql.Data.Common.IscException: Exception of type 'FirebirdSql.Data.Common.IscException' was thrown.
at FirebirdSql.Data.Client.Gds.GdsConnection.Connect(String dataSource, Int32 port, Int32 packetSize, Charset charset)
at FirebirdSql.Data.Client.Gds.GdsDatabase.Attach(DatabaseParameterBuffer dpb, String dataSource, Int32 port, String database)
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
--- End of inner exception stack trace ---
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.Create()
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut()
at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
at Seljax.Database.Firebird.DatabaseManager.TryToConnect()

Мне показалось бы, что это указывает на проблему с сетью, возможно, пожарную стену или что-то в этом роде? И все же я не могу найти блок?

Дополнительная информация (2 разных случая):

Случай 1 (сеть 1):


Компьютер под управлением Windows 7 x64 с пакетом обновления 1. Я настроил firebird для использования порта 5013, и он прекрасно подключается, если указать локальный адрес обратной связи (127.0.0.1). Кроме того, он просто прекрасно подключается к локальному IP-адресу (10.206.34.177), который в настоящее время настроен как сатирический с сетевой маской 255.255.255.192. Однако если я изменю этот компьютер на использование динамического IP-адреса (полученного с сервера DHCP) и попытаюсь подключиться к IP-адресу (в этом случае я получаю маску 10.206.34.184 255.255.255.192), я получаю исключение выше. Насколько я могу судить, я настроил все так же, как сервер DHCP, за исключением использования статического IP-адреса. В дополнение ко всему этому, я попробовал следующее, чтобы он работал с динамическим IP-адресом: - выключил брандмауэр windows - отключил Microsoft Secuirty Essentials (защита в режиме реального времени) - отключил как брандмауэр, так и MSE - обеспечен минимальный контроль учетных записей - Отключен IPV6 из конфигурации сети

Насколько я могу судить, сеть настроена так, чтобы не фильтровать какой-либо внутренний сетевой трафик. Я могу нормально проверить связь с локальной системой. У меня есть простая программа, которая открывает сокет для системы с помощью класса TcpClient в c #, и он просто прекрасно подключается к ip и порту, что, я думаю, означает, что соединение с сокетом установлено, что, казалось бы, указывает на то, что оно будет работать.

Обратите внимание, я выглядел как можно лучше, я не смог найти другие антивирусы или брандмауэры, установленные вне Microsoft Security Essential и встроенного брандмауэра.

Итого в убыток, предложения, пожалуйста?

Случай 2 (сеть 2):


Windows 7 x32 компьютер, без SP1. Я оставил порт firebird настроенным на 3050. К этой машине я даже не могу подключиться, используя адрес обратной связи (127.0.0.1). Я пробовал статический, нестатический, отключение IPV6, отключение брандмауэра и отключение MSE. IP для этой машины: 10.200.81.179 маска 255.255.255.192.

Обновление - теперь этот аппарат может подключаться к себе после изменения всех трех машин в сети на использование статических IP-адресов, но появилась новая проблема, перечисленная ниже

Опять же, в полном недоумении, идеи, предложения, пожалуйста?

Еще больше информации: Я установил сумасшедшую простую тестовую программу, которая имеет 3 текстовых поля, которые я могу заполнить, чтобы подключиться к базе данных, и я убежден, что она работает, как и ожидалось, с запущенным firebird, и если он не запущен, то выдает точно такие же ошибки Я попадаю на машины клинета.

Так, например, вы запускаете службу firebird, запускаете connect, success, закрываете службу, запускаете connect и исключение, указанное выше, и все остальные исключения из FbException будут соответствовать тому из машин, которые я пытаюсь подключиться к.

У меня есть все настройки кода по нажатию кнопки, во всяком случае, для ссылки на код, который вызовет исключение, здесь:

        // setup connection
        FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
        csb.DataSource = firebirdAddress.Text;
        csb.Port = Convert.ToInt32(firebirdPort.Text);
        csb.Database = firebirdPath.Text;
        csb.ServerType = 0;
        csb.UserID = "SYSDBA";
        csb.Password = "masterkey";
        csb.Dialect = 3;

        // generate the conneciton object
        string connectionString = csb.ToString();
        FbConnection connection = new FbConnection(connectionString);

        try
        {
            MessageBox.Show("Trying to connect with string: " + Environment.NewLine + connectionString);
            connection.Open();
            MessageBox.Show("Firebird connected successfully!");
        }
        catch ( Exception exception)
        {
            FbException fireException = (FbException) exception;

            for ( int i = 0; i < fireException.Errors.Count; i++ )
            {
                MessageBox.Show("Class: " + fireException.Errors[i].Class.ToString() + Environment.NewLine +
                    "Error #" + fireException.Errors[i].Number.ToString() + ": " + fireException.Errors[i].Message + " on line " +
                    fireException.Errors[i].LineNumber.ToString() );
            }


            MessageBox.Show("Exception caught: " + Environment.NewLine + exception.ToString());

            // loop through all inner exceptions
            while ( exception.InnerException != null )
            {
                MessageBox.Show("Inner exception: " + Environment.NewLine + exception.InnerException.ToString());
                exception = exception.InnerException;
            }

        }
        finally
        {
            connection.Close();
            connection = null;
            connectionString = null;
            csb = null;
        }

В любом случае, любые предложения или информация будут очень ценными!


Появилась некоторая дополнительная информация. В случае 1, описанном выше, я успешно могу подключиться к компьютеру с помощью компьютера с Windows XP и кода, показанного выше для подключения.

Windows делает что-то странное с IP-маршрутизацией ??


Обновление:В случае, если компьютер 2 не может подключиться к адресу 127, он был «исправлен», изменив всю машину в сети на использование статического IP-адреса. однако случай 2 стал более интересным. В сенарио три компьютера. Теперь все трое могут "sortof" общаться, так как все они настроены на статические IP-адреса.

Details of communication:
Computer A     Computer B    Computer C
works          works         doesn't work          Computer A
works          works         doesn't work          Computer B
doesn't work   works         works                 Computer C

Очевидным ответом будет поставить сервер на компьютер B и работать с ним, но он не работает с точки зрения логистики, поскольку этот компьютер очень плохой компьютер и редко включен. Обратите внимание, все три работают под управлением Windows 7


Разрешение: Случай 2 выше, где некоторые компьютеры не могли общаться с другими, и было задействовано 3 машины, оказалось, что в сети было 2 компьютера с одинаковым именем. Мое лучшее предположение состоит в том, что окна, или firebird, или оба, так или иначе, зависят от имени для общения, и дублирующее имя блокировало его.

В случае 1 мы решили использовать только статический IP-адрес. Не уверен, почему это необходимо, но это решает проблему. кроме того, в этой сети есть вторая машина, которая также является Windows 7 и не будет правильно подключаться без статического IP-адреса.

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Поскольку информация, опубликованная в ваших комментариях, я думаю, что ваша проблема может быть одной из следующих:

  • Локальный брандмауэр Windows или другое программное обеспечение брандмауэра (например, AntiVirus) блокирует соединение.Обычно вам нужно вручную добавить правило или исключение, чтобы разрешить входящий трафик на порт, который прослушивает Firebird.
  • Firebird не прослушивает этот конкретный интерфейс (маловероятно, если вы не изменили конфигурацию),проверьте RemoteBindAddress вашего файла firebird.conf
## Позволяет связывать входящие соединения с IP-адресом# конкретная сетевая карта.Это позволяет отклонить входящие соединения# через любой другой сетевой интерфейс, кроме этого.По умолчанию,# разрешены соединения с любого доступного сетевого интерфейса.# Если вы используете Classic Server, этот параметр предназначен только для Windows.# В Linux, BSD или Mac OS X с классическим сервером используйте xinetd или launchd# файл конфигурации (параметр связывания)## Тип: строка#RemoteBindAddress = 127.0.0.1

Вы можете проверить, прослушивает ли Firebird через порт команду netstat -a.

Этот вывод означает, что Firebird слушает на всех интерфейсах:

  TCP    0.0.0.0:3050           jacastillo:0           LISTENING

, в то время как это когда он слушает определенно в 127.0.0.1

  TCP    127.0.0.1:3050         jacastillo:0           LISTENING

3050 по умолчаниюпорт, проверьте, какой порт вы слушаете

1 голос
/ 25 марта 2011

Итак, в случае 2 проблема оказалась в том, что в сети было два компьютера с одинаковым именем !!!

Я сейчас немного отстранен от простоты проблемы и странных симптомов, которые это вызывало.

Я не уверен, как или почему это было так, но сейчас это исправлено. Я буду проверять на случай 1 завтра.

Для справочного случая 1 и случая 2, где в двух отдельных сетях.

...