gpt4 book ai didi

ios - Delphi Datasnap 连接错误与 IPv6 (iOS)

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:09:01 26 4
gpt4 key购买 nike

我们有一个 iOS 和 Android 应用程序,它使用 Datasnap 从终端用户的手机/平板电脑连接到他们的 Datasnap Windows 数据库服务器。一切正常,只是现在 Apple 拒绝了我们应用程序的新版本,因为它不兼容 IPv6。好的

我们的 Firemonkey 移动应用程序 (Delphi Seattle) 允许最终用户设置他们自己的服务器配置(IP 和端口)。他们必须在他们自己的服务器 中运行 Windows PC 服务器应用程序,因此,没有任何主机名。他们只知道他们的服务器公共(public) IP 地址。服务器应用程序安装在一台简单的 Windows PC 中。不是 Web 服务器、域等,因此没有任何服务器主机名,而是 IP 地址。

按照 Apple 的说明创建 IPv6 私有(private)共享网络后,问题仍然存在。尝试从我的 iPad 连接到任何 IP 地址 时,我收到“Server Unreachable”错误。我读到过将方括号 [ ] 与 hostname 一起使用会起作用,但我无法理解。也许它只适用于主机名,不适用于 IP 地址?

这是我连接到服务器的简化代码部分:

客户端(移动应用程序):- TSQLConnection(Datasnap 驱动程序。通信协议(protocol):tcp/ip)- TDSProviderConnection

    SQLConnection1.Params.Values['HostName'] := MY_SERVER_IP;
try
DSProviderConnection1.Connected:=true;
except
showmessage('error');
end;

我已经为 MY_SERVER_IP 尝试了 XX.XX.XX.XX 和 [XX.XX.XX.XX] 值,但没有成功。我不知道我是否必须在服务器的 Windows 应用程序中或仅在客户端(移动/firemonkey)中更改某些内容

有什么解决办法吗?

最佳答案

我知道了

我找到了一个中文论坛,里面有一些我以前没有发现的技巧。

可以使用以下参数配置 Datasnap 通信 IP 版本:

TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion

默认情况下,如果为空,则为 IPv4。因此,在 TSQLConnection.OnBeforeConnect 事件中,只需添加以下行:

// You need to know if you are on IPv4 or IPv6 first. I explain it later.

if ipversion='IPv4' then
TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion:='IP_IPv4'
else
TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion:='IP_IPv6';

就是这样!!当然,您需要知道您是在 IPv4 网络上还是在 IPv6 网络上。我使用 TidTcpClient 组件来执行此操作。该组件有一个您可以设置的“IPVersion”参数。

因此,首先,尝试使用 IPVersion:=Id_IPv4 进行连接。如果成功,则您位于 IPv4 网络中。如果没有,那么您可能在 IPv6 网络上(或服务器已关闭)。所以……

    IdTCPClient1.IPVersion:=Id_IPv4;  // <--  try IPv4 first
IdTCPClient1.Host:=MY_IP;
try
IdTCPClient1.Connect;
result:=true;
ipversion := 'IPv4'; // <-- will tell us what ip version to use
except
end;

if IdTCPClient1.Connected=false then
begin
try
IdTCPClient1.IPVersion:=Id_IPv6; // <-- now try IPv6
IdTCPClient1.Connect;
result:=true;
ipversion:='IPv6'; // <-- will tell us what ip version to use
except
end;
end;

仅此而已。现在,该应用程序可以在我的 iPad 上在 IPv4 和 IPv6 上正常运行!

关于ios - Delphi Datasnap 连接错误与 IPv6 (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45215172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com