OGeek|极客世界-中国程序员成长平台

标题: ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:19
标题: ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误

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

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

按照 Apple 的说明创建 IPv6 专用共享网络后,问题存在。尝试从我的 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)上进行更改

有什么办法吗?



Best Answer-推荐答案


我明白了

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

可以使用以下参数配置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 - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45215172/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4