似乎无法让Firebird连接到本地IP地址

时间:2011-03-24 18:24:50

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

我在使用Firebird和.net的几个客户端站点上遇到了一个奇怪的问题。我正在使用firebird 2.1和DDEX Provider for 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):


运行Service Pack 1的Windows 7 x64计算机。我已经将firebird配置为使用5013的端口,如果我指定了本地环回地址(127.0.0.1),它就可以正常连接。此外,它可以很好地连接本地IP地址(10.206.34.177),当前配置为satic,网络掩码为255.255.255.192。但是,如果我将此计算机更改为使用动态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 security essensial和内置防火墙之外的任何其他防病毒软件或防火墙。

Totaly不知所措,建议吗?

案例2(网络2):


Windows 7 x32计算机,无SP1。我已经将firebird端口配置为3050.这台机器甚至无法连接到使用环回地址(127.0.0.1)。我尝试过静态,非静态,禁用IPV6,禁用防火墙和禁用MSE。本机的IP:10.200.81.179 mask 255.255.255.192。

更新 - 在更改网络上的所有三个机器以使用静态IP地址后,此机器现在可以连接到自身,但是出现了一个新问题,如下所列

再一次,总是茫然的想法,建议吗?

更多信息: 我已经设置了一个疯狂的简单测试程序,它有3个文本框,我可以填充以连接到数据库,并且我已经确认它确实可以正常运行firebird运行,并且如果没有运行它会生成完全相同的错误我上了clinet机器。

例如,您启动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 routing做了一些奇怪的事吗??


更新: 通过更改网络上的所有机器以使用静态IP地址,已经“修复”了案例2中无法连接到127地址的计算机。但案例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上并继续使用它,但它并不适用于logisticaly,因为该计算机是一台非常糟糕的计算机,并且很少使用。注意,这三个都在运行Windows 7


分辨率: 上面的案例2,其中一些计算机无法与其他人交谈,并且涉及3台机器,结果是在网络上有2台具有相同名称的计算机。我最好的猜测是,windows或firebird,或两者都以某种方式依赖于通信的名称,并且重复的名称阻止了它。

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

2 个答案:

答案 0 :(得分:2)

正如您在评论中发布的信息,我认为您的问题可能是其中之一:

  • 本地Windows防火墙或其他防火墙软件(例如AntiVirus)正在阻止连接。您通常必须手动添加规则或例外以允许将流量输入到Firebird正在侦听的端口。
  • Firebird没有监听该特定接口(如果您没有更改配置,则不太可能),请检查firebird.conf文件的RemoteBindAddress

#允许传入连接绑定到
的IP地址 #特定网卡。它可以拒绝进入的连接 #通过除此之外的任何其他网络接口。默认情况下,
允许来自任何可用网络接口的#连接 #如果您使用的是Classic Server,则此设置仅适用于Windows #在Linux,BSD或Mac OS X下,使用经典服务器使用xinetd或launchd
#配置文件(绑定参数)

#Type:string

RemoteBindAddress = 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是默认端口,检查您正在侦听的正确端口

答案 1 :(得分:1)

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

由于问题的简单性和产生的奇怪症状,我现在有点不在身边。

我不确定这是怎么回事,为什么会这样,但现在已经修好了。我将在明天检查案例1。

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

相关问题