我们有一个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)
任何解决方案?
答案 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上运行良好!