【问题标题】:Can't seem to get Firebird to connect to a local IP address似乎无法让 Firebird 连接到本地 IP 地址
【发布时间】:2011-03-24 18:24:49
【问题描述】:

我在几个使用 Firebird 和 .net 的客户端站点上遇到了一个奇怪的问题。我正在使用 firebird 2.1 和 Visual Studio 的 DDEX Provider,我正在使用 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 计算机,运行 Service Pack 1。我已将 firebird 配置为使用 5013 端口,如果我指定本地环回地址 (127.0.0.1),它就可以正常连接。此外,它可以很好地连接当前配置为 satic 且网络掩码为 255.255.255.192 的本地 IP 地址 (10.206.34.177)。但是,如果我将这台计算机更改为使用动态 IP 地址(从 DHCP 服务器获取),并尝试连接到 IP(在这种情况下,我得到的是 10.206.34.184 掩码 255.255.255.192)我得到了上面的异常。据我所知,除了使用静态 IP 之外,我已经配置了与 DHCP 服务器提供的相同的所有内容。除此之外,我尝试了以下方法以使其与动态 IP 地址一起使用: - 关闭 Windows 防火墙 - 关闭 microsoft secuirty essencials(实时保护) - 关闭防火墙和 MSE - 确保用户帐户控制设置为最低 - 从网络配置中禁用 IPV6

据我所知,网络设置为不过滤任何类型的内部网络流量。我可以ping本地系统就好了。我有一个简单的程序,它使用 c# 的 TcpClient 类打开一个到系统的套接字,它可以很好地连接到 ip 和端口,我认为这意味着建立了一个套接字连接,这“似乎”表明它可以工作。

请注意,我已尽我所能找到任何其他防病毒或防火墙安装在 Microsoft 安全基础和内置防火墙之外。

完全不知所措,请给点建议?

案例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 运行时可以按预期工作,并且没有运行它会产生完全相同的错误我上了clinet机器。

例如,您启动 firebird 服务,运行连接,成功,关闭服务,运行连接,以及上面的异常,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 变得更有趣了。 senario 中有三台计算机。这三个现在可以“排序”通信,因为它们都设置为静态 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台同名电脑。我最好的猜测是 windows 或 firebird 或两者都依赖于通信的名称,而重复的名称阻止了它。

在案例 1 中,我们采用的解决方案只是将机器保持为静态 IP 地址。不知道为什么这是必要的,但它确实解决了问题。此外,该网络上还有第二台机器也是 Windows 7,如果没有静态 IP 地址,将无法正确连接。

【问题讨论】:

  • 是的,在所有机器上似乎完全一致,ISQL 工作正常。
  • 实际上,这很好,ISQL 的连接方式与 .net dll 的连接方式不一样吗?还是做一些完全不同的事情?
  • 仔细检查您是否使用相同的地址连接到数据库。连接到c:\path\to\database.fdb 比连接到127.0.0.1:c:\path\to\database.fdb 比连接到domain.name.net:c:\path\to\database.fdb 是不一样的。下一步是测试你是否可以通过同一个子网远程连接到同一台机器,然后从其他子网尝试,就是这样。
  • 哦!完美,我会试一试,让你知道
  • 好的,有趣的行为,我可以在我的本地机器上连接(我先尝试一下),在 isql 中使用这个命令:connect '127.0.0.1:';但不是这个:connect '192.168.1.17:';

标签: c# .net networking windows-7 firebird


【解决方案1】:

作为您的 cmets 中发布的信息,我认为您的问题可能是其中之一:

  • 本地 Windows 防火墙或其他防火墙软件(例如防病毒软件)正在阻止连接。您通常必须手动添加规则或例外,以允许传入流量到 Firebird 正在侦听的端口。
  • Firebird 没有侦听该特定接口(如果您没有更改配置,则不太可能),请检查 firebird.conf 文件的 RemoteBindAddress
#
# 允许传入连接绑定到a的IP地址
#特定网卡。它可以拒绝传入的连接
# 通过除此之外的任何其他网络接口。默认情况下,
# 允许来自任何可用网络接口的连接。
# 如果您使用的是经典服务器,此设置仅适用于 Windows。
# 在 Linux、BSD 或 Mac OS X 下,经典服务器使用 xinetd 或 launchd
# 配置文件(绑定参数)
#
# 类型:字符串
#
远程绑定地址 = 127.0.0.1

您可以使用netstat -a 命令检查 Firebird 是否正在侦听该端口。

这个输出意味着 Firebird 正在监听所有接口:

  TCP    0.0.0.0:3050           jacastillo:0           LISTENING

这是它专门在 127.0.0.1 中监听的时候

  TCP    127.0.0.1:3050         jacastillo:0           LISTENING

3050 是默认端口,请检查您正在监听的正确端口

【讨论】:

  • 你可能没有关注 jachguate 和我的谈话,但我们已经将计算机切换到一个站点上的静态 IP,我们现在仍然可以连接到 127.0.0.1,但至于连接到其他电脑,就不行了。我尝试将绑定地址设置为静态 IP,并尝试从另一台机器连接到它但没有成功。我现在才得到 netstat 数据,一会儿我会发布。
  • @Beau 我关注是因为我是 jachguate...:D
  • 好的,所以 netstat 列出了以下内容: TCP 10.200.81.153:5555 ValuedCustomer:0 LISTENING 在这种情况下,这是我网格中主要问题中的“计算机 A”。计算机 B 是“ValuedCustomer”机器
  • 您会注意到,我现在也将这台机器上的端口更改为监听 5555 而不是 3050。
  • @Beau,ValuedCustomer 必须是您运行 netstat 命令的同一台机器的 Windows 名称,因为这列出了一个 LISTENING 连接。
【解决方案2】:

好的,所以在案例 2 中,问题原来是网络上有两台同名的计算机!!!

由于问题的简单性和由此产生的奇怪症状,我现在有点发疯了。

我不知道这是怎么回事,为什么会这样,但现在已经解决了。明天我将检查案例 1。

对于参考案例 1 和案例 2,在两个单独的网络上。

【讨论】:

  • 案例 1,设置为 DHCP 时无法连接到网络地址,只需将其保留为静态 ip 即可解决。
  • 当然你可以连接到DHCP分配的IP地址,你可以连接到正确配置的网络中的机器名,比如SomeMachine:/path/to/db.fdb
  • 哦,谢谢!这可能是另一种方法(按机器名称连接)
  • +1 发布有关此尴尬事故的常规答案。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多