2017-07-20 45 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網絡,而無需實際連接到服務器。 –