为什么通过 MyDAC TMyConnection 运行的查询有时会失败,因为连接协议(IPv4 与 IPv6)发生变化

问题描述 投票:0回答:1

场景

我的应用程序通过在托管我的数据库的同一服务器上运行一个小型 PHP 脚本来获取用户的公共 IP 地址。然后,我以编程方式将该 IP 地址插入到远程主机表中,以便我可以远程访问数据库以在端口 3306 上运行查询等。

当我第一次获取 IP 地址时,它可能会返回 IPv4 或 IPv6,具体取决于服务器的突发奇想。我存储获得的 IP 地址,通过将 TMyconnection 设置为 true 来测试连接 - 工作正常并再次断开连接。稍后,当我使用 TMyquery 对数据库运行查询时,我重新连接,或者让查询执行此操作,然后运行查询。

我确实有办法将我的 IP 地址明确指定为 IPv4,这样我就可以在 IPv4 上进行标准化并始终将其存储在远程主机中。

问题

假设我有一个 IPv4 地址存储在远程主机表中(形式为 185.83.68.71)并且测试连接已通过。 有时(但并非总是如此),当应用程序稍后运行查询时,它会从数据库返回错误,内容如下:“Connection Error :#28000User 'myuser'@'2a0c:5c86:8220:1:8905: f958:d2f8:368d'(使用密码:YES),即 TMyconnection 现在尝试使用我用户的 IPv6 IP 地址访问数据库。这当然会失败,因为该地址不在远程主机中。

我也遇到过相反的情况。应用程序存储 IPv6 地址并测试连接正常,但 TMyConnection 随后使用 IPv4 地址,由于 IPv4 地址不在远程主机表中,因此失败。

问题

(1) TMyconnection 本身是否在每次连接时从某处获取用户的 IP 地址,该地址可能作为与应用程序获取的协议不同的协议返回?如果不是,它如何知道用于连接的协议是 IPv4 还是 IPv6?

(2) 有没有办法强制 TMyconnection 始终使用 IPv4?然后我的应用程序始终可以获取用户的 IPv4 IP 地址,并始终存储与 TMyConnection 将使用的地址相匹配的地址。

(我在 Devart 论坛上发布了类似的问题,但不是很活跃,而且这里有更多有才华的人!)

mysql ipv6 ipv4 devart
1个回答
0
投票

找到了我的问题 2 的答案,所以我将其放在这里以防其他人需要。 TMyConnection 有一个属性 Options 和一个属性 IPVersionIPversion 可以设置为值 ivIPv4ivIPv6ivIPboth

但默认值为 ivIPv4,因此我的应用程序中使用的 TMyConnection 在连接时应该仅使用 IPv4 响应。所以我仍然不明白为什么它有时使用 IPv6 地址,而我的问题 1 仍然没有得到解答。

© www.soinside.com 2019 - 2024. All rights reserved.