2011-03-24 282 views
1

我在Firebird和.net的几个客户端网站上遇到了一个奇怪的问题。我正在使用firebird 2.1和用于visual studio的DDEX Provider,并且正在使用c#。 Specificaly我得到一个非常普遍的例外情况如下:似乎无法让Firebird连接到本地IP地址

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):


视窗7 X64的计算机,运行的服务包1.我已经配置火鸟使用的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防火墙 - 关闭了微软安全实用程序(实时防护) - 关闭了防火墙和MSE - 确保用户帐户控制设置为最低 - 从网络配置中禁用IPV6

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

请注意,我看起来最好,我无法找到任何其他防病毒或防火墙安装在微软安全essensial以外,内置防火墙。

Totaly茫然,建议请?

案例2(网络2):


的Windows 7 X32电脑,没有SP1。我已经将firebird端口配置为3050.我甚至无法使用环回地址(127.0.0.1)连接到此机器。我试过静态,非静态,禁用IPV6,禁用防火墙和禁用MSE。本机的IP:10.200.81.179掩码255.255.255.192。

更新 - 这台机器现在可以连接到自身,改变网络使用静态IP地址在所有三个machiens后,但低于

介绍,一个新的问题重新列,完全以在对意见,建议亏损请?

更多信息: 我已经安装了一个疯狂的简单测试程序,它有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; 
     } 

不管怎样,任何建议或信息将非常appricated!


一些更多的信息,已经到了光,如果上述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上的服务器,并用它去,但它好好尝试一下logisticaly工作,因为该计算机是一个非常贫穷的机器,并且很少上。请注意,所有三个运行的是Windows 7


分辨率: 以上,其中一些电脑不能跟他人和有参与了3台机器的情况下2,原来是有2台电脑使用相同网络上的名称。我最好的猜测是windows或firebird,或者两者都以某种方式依赖于通信的名称,而重复的名称则阻止了它。

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

+0

你可以从isql连接吗? – jachguate 2011-03-24 19:16:28

+0

是的,它似乎在机器上非常安全,ISQL工作正常。 – Beau 2011-03-24 19:30:27

+0

其实,这是一个很好的观点,ISQL不会像.net dll那样以几乎相同的方式进行连接?还是它做了一些完全不同的事情? – Beau 2011-03-24 19:31:27

回答

1

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

我现在有点浑身解体,问题很简单,而且这种奇怪的症状正在产生。

我不确定这是怎么或为什么,但它现在已经修复。我将检查Case 1明天。

对于在两个独立网络中的情况1和情况2。

+0

案例1,通过将其设置为DHCP时无法连接到网络地址,只需将其保留为静态IP即可解决。 – Beau 2011-03-25 16:58:16

+0

当然你可以连接到DHCP分配的IP地址,你可以连接到正确配置的网络中的机器名,比如'SomeMachine:/ path/to/db.fdb' – jachguate 2011-03-25 17:40:26

+0

哦,谢谢!这可能是另一种方式(通过机器名称连接) – Beau 2011-03-28 18:10:58

2

,张贴在您的评论的信息,我认为你的问题可能是其中之一:

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

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

#类型:字符串

RemoteBindAddress = 127.0.0.1

您可以使用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是默认的端口,检查权你正在听的端口

+0

您可能没有关注jachguate和我的对话,但我们已经将计算机切换到一个站点上的静态IP,现在我们可以连接到127.0.0.1,但是连接到其他计算机时,它无法工作。我尝试将绑定地址设置为静态IP,并尝试从另一台机器连接到它,但未成功。我现在只是获取netstat数据,稍后我会发布。 – Beau 2011-03-24 20:57:15

+0

@Beau我跟随,因为我jachguate ...:D – jachguate 2011-03-24 21:02:12

+0

哦..这是愚蠢的。抱歉。 – Beau 2011-03-24 21:04:46