【发布时间】: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