Delphi Datasnap与IPv6的连接错误(iOS)

时间:2017-07-20 12:45:05

标签: ios delphi firemonkey ipv6 datasnap

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

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

按照Apple的说明创建IPv6专用共享网络后,问题就存在了。尝试从iPad连接到任何 IP地址时,出现“服务器无法访问”错误。 我已经读过,使用带有主机名的方括号[]将起作用,但我无法得到它。也许它只适用于主机名,而不是ip地址?

以下是我与服务器建立连接的代码的简化部分:

客户端(移动应用): - TSQLConnection(Datasnap Driver。通信协议: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应用程序中更改某些内容或仅在客户端更改(mobile / firemonkey)

任何解决方案?

1 个答案:

答案 0 :(得分:0)

我明白了

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

可以使用以下参数配置 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上运行良好!