是否可以强制Pervasive不尝试IPv6连接

本文关键字:IPv6 连接 Pervasive 是否 | 更新日期: 2023-09-27 18:19:51

通过使用探查器,我注意到当我们连接到Pervasive数据库时,引擎总是抛出一个System.Net.Sockets.SocketException,其内容为:

由于目标计算机主动拒绝,无法建立连接::1:1583

它只有一个小小的堆栈轨迹:

在System.Net.Socket.Socket.DoConnect(端点端点快照,SocketAddress SocketAddress)

显然,普适数据库引擎总是首先尝试IPv6版本的localhost(在本例中为服务器),然后在返回IPv4连接并成功之前失败。因此,成功的幻想得以维持,但在这个过程中消耗了很多例外。

但在我看来,每次尝试连接时都必须为使用一个异常,这简直太糟糕了。

这是正常的做事方式吗?或者有没有什么方法可以强制使用IPv4,而忽略IPv6?请注意,任何以"在Windows中关闭"结尾的答案都是不可行的。如果我不能在代码中控制它,我就只能接受它

我怀疑第一个反驳会是,"如果客户端想要、需要或者至少可以使用IPv6怎么办?"。老实说,我不知道。我会接受关于这个话题的任何建议,因为网络不是我的强项。但我同意这样一种观点,即如果IPv6可用,它可能应该被使用。

然而,我想说的主要一点是,当IPv6不可用时,我的代码被迫吃掉大量异常,这让我很困扰

只是为了展示一些东西,下面是代码中的样子:

private PsqlConnection _connection = new PsqlConnection();
_connection.ConnectionString = String.Format("Server={0};ServerDSN={1}", _serverName, _dbName);
try { _connection.Open(); }
catch (Pervasive.Data.SqlClient.PsqlException ex) { /*write Pervasive-specific error to log*/ }
catch (Exception ex) { /*write generic error to log*/ }

Open()调用周围的try块实际上从未被命中。它似乎在冒泡,我可以打破它,但它被处理得更深。两个catch实际上都没有被击中。

是否可以强制Pervasive不尝试IPv6连接

在连接字符串中将EnableIPV6设置为false。。。

从这里拍摄。。。表27"为使用IPv4地址连接到普及服务器提供向后兼容性。

如果设置为True,则安装了IPv6协议的客户端可以使用IPv4地址或IPv6地址向服务器标识自己。

如果设置为False,则客户端将以向后兼容模式运行。客户端始终使用IPv4地址向服务器标识自己。

4.0的默认值设置为True,而3.5的默认值则设置为False。此选项对3.2 无效

为了确保使用VPN连接到Pervasive Server的用户不会因使用额外许可证而获得积分,Pervasive建议Data Provider 3.5的用户将EnableIPv6设置为True。"

更新:您检查过InfoMessage事件吗?。。。"可以使用PsqlConnection对象的InfoMessage事件从数据库中检索警告和信息性消息。如果数据库返回错误,则会引发异常。

想要处理数据库服务器发送的警告和信息性消息的客户端应该创建一个PsqlInfoMessageEventHandler委托来注册此事件。

InfoMessage事件接收一个PsqlInfoMessageEventArgs类型的参数,该参数包含与此事件相关的数据。"