Delphi Datasnap与IPv6(iOS)的连接错误
我们有一个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)更改某些内容
任何解决方案?
我明白了
我发现了一个中国论坛,有一些技巧我还没找到。
它可以使用以下参数配置的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!
由于Apple专注于IPv6,我建议您尝试连接先是IPv6,然后回退到IPv4,而不是相反。另外,请查看Indy的'TidStack.GetLocalAddressList()'方法,该方法还可以告知您是否连接到IPv6网络,而无需实际连接到服务器。 –
IP v6类似于2001:0db8:85a3:08d3:1319:8a2e:0370:7344 - 没有点,不仅有四个组。只要将IP v4地址括在括号内,将不会使其成为有效的IP v6地址。您需要知道服务器的IP v6地址... – mjn42
使用ipconfig(在服务器上)查找其网络适配器的IP v6地址以进行内部测试。对于公共服务器,网络管理员应该知道它的IP v6地址 – mjn42
另请参阅https://stackoverflow.com/questions/37691084/ipv6-connection-with-datasnap – mjn42