2017-07-20 78 views
2

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

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

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

这里是代码的简化部分,其中我做到服务器的连接:

客户端侧(移动应用): - 设为TSQLConnection(的DataSnap驱动程序通信协议: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)更改某些内容

任何解决方案?

+0

IP v6类似于2001:0db8:85a3:08d3:1319:8a2e:0370:7344 - 没有点,不仅有四个组。只要将IP v4地址括在括号内,将不会使其成为有效的IP v6地址。您需要知道服务器的IP v6地址... – mjn42

+0

使用ipconfig(在服务器上)查找其网络适配器的IP v6地址以进行内部测试。对于公共服务器,网络管理员应该知道它的IP v6地址 – mjn42

+0

另请参阅https://stackoverflow.com/questions/37691084/ipv6-connection-with-datasnap – mjn42

回答

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!

+0

由于Apple专注于IPv6,我建议您尝试连接先是IPv6,然后回退到IPv4,而不是相反。另外,请查看Indy的'TidStack.GetLocalAddressList()'方法,该方法还可以告知您是否连接到IPv6网络,而无需实际连接到服务器。 –