2
votes

We have an iOS and Android app that uses Datasnap to connect to end-user's datasnap Windows database servers from their mobiles/tablets. Everything was working fine, except now Apple rejects the new version of our app because it is not IPv6 compatible. Ok

Our Firemonkey mobile app (Delphi Seattle) lets end-users to set up their own server configuration (IP and Port). They must have a Windows PC server application running in their own server, so, there isn't any HOSTNAME. They just know their server Public IP address. The server application is installed in a simple Windows PC. Not a web server, domain, etc. so there isn't any server host-name, but an IP address.

After following Apple's instructions to create a IPv6 private shared network, the problem exists. I get "Server Unreachable" error when trying to connect to any IP address from my iPad. I have read that using brackets [ ] with the hostname will work, but I can't get it. Maybe it only works with hostnames, not ip addresses?

Here is a simplified portion of code where I do the connection to the server:

Client side (mobile app): - TSQLConnection (Datasnap Driver. Communication protocol: tcp/ip) - TDSProviderConnection

    SQLConnection1.Params.Values['HostName'] := MY_SERVER_IP;
    try
        DSProviderConnection1.Connected:=true;
    except
        showmessage('error');
    end;

I have tried XX.XX.XX.XX and [XX.XX.XX.XX] values for MY_SERVER_IP with no success. I don't know if I have to change something in the server's Windows application or just on client-side (mobile/firemonkey)

Any solution?

1
IP v6 is something like 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 - no dots, not only four groups. Just enclosing a IP v4 address in brackets will not make it a valid IP v6 address. You need to know the IP v6 address of the server...mjn42
Use ipconfig (on the server) to find the IP v6 address of its network adapter for internal testing. For a public server, the network administrator should know its IP v6 adressmjn42

1 Answers

0
votes

I got it

I found a chinese forum with some tricks I haven't found before.

It is possible to configure the Datasnap Communication IP version with the following parameter:

TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion

By default, if empty, it is IPv4. So, on the TSQLConnection.OnBeforeConnect event, just added the following line:

// 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';

And that's all!! Of course, you need to know if you are on a IPv4 network or in a IPv6 one. I do this with a TidTcpClient component. That component has a 'IPVersion' parameter you can set up.

So, first, try to connect using IPVersion:=Id_IPv4. If successful, you are on a IPv4 network. If not, then you probably are on a IPv6 network (or server is down). So...

    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;

And that's all. Now the app works fine on both IPv4 and IPv6 from my iPad!