菜鸟教程小白 发表于 2022-12-11 18:19:27

ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误


                                            <p><p>我们有一个 iOS 和 Android 应用程序,它使用 Datasnap 从他们的手机/平板电脑连接到最终用户的 datasnap Windows 数据库服务器。一切正常,除了现在 Apple 拒绝了我们应用的新版本,因为 <em>它不兼容 IPv6</em>。好的</p>

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

<p>按照 Apple 的说明创建 IPv6 专用共享网络后,问题存在。尝试从我的 iPad 连接到任何 <strong>IP 地址</strong> 时,我收到“<em>Server Unreachable</em>”错误。
我已经读过在 <em>hostname</em> 中使用方括号 [ ] 会起作用,但我无法理解。也许它只适用于主机名,而不适用于 IP 地址?</p>

<p>这是我连接到服务器的代码的简化部分:</p>

<p>客户端(移动应用):
- TSQLConnection(Datasnap 驱动程序。通信协议(protocol):tcp/ip)
- TDSProviderConnection</p>

<pre><code>    SQLConnection1.Params.Values[&#39;HostName&#39;] := MY_SERVER_IP;
    try
      DSProviderConnection1.Connected:=true;
    except
      showmessage(&#39;error&#39;);
    end;
</code></pre>

<p>我已经为 MY_SERVER_IP 尝试了 XX.XX.XX.XX 和 值,但没有成功。
我不知道我是否必须在服务器的 Windows 应用程序或客户端(移动/firemonkey)上进行更改</p>

<p>有什么办法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我明白了</p>

<p>我发现了一个中文论坛,里面有一些我以前没有发现的技巧。</p>

<p>可以使用以下参数配置<strong>Datasnap通信IP版本</strong>:</p>

<pre><code>TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion
</code></pre>

<p>默认情况下,如果为空,则为 IPv4。
因此,在 <em>TSQLConnection.OnBeforeConnect</em> 事件上,只需添加以下行:</p>

<pre><code>// You need to know if you are on IPv4 or IPv6 first. I explain it later.

if ipversion=&#39;IPv4&#39; then   
    TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion:=&#39;IP_IPv4&#39;
else
    TDBXDatasnapProperties(SQLConnection1.ConnectionData.Properties).CommunicationIPVersion:=&#39;IP_IPv6&#39;;
</code></pre>

<p>仅此而已!
当然,您需要知道您是在 IPv4 网络上还是在 IPv6 网络上。
我用一个 <em>TidTcpClient</em> 组件来做到这一点。该组件有一个您可以设置的“IPVersion”参数。</p>

<p>因此,首先,尝试使用 IPVersion:=Id_IPv4 进行连接。如果成功,则您在 IPv4 网络上。如果没有,那么您可能在 IPv6 网络上(或服务器已关闭)。所以...</p>

<pre><code>    IdTCPClient1.IPVersion:=Id_IPv4;// &lt;--try IPv4 first
    IdTCPClient1.Host:=MY_IP;
    try
      IdTCPClient1.Connect;
      result:=true;
      ipversion := &#39;IPv4&#39;;      // &lt;-- will tell us what ip version to use
    except
    end;

    if IdTCPClient1.Connected=false then
    begin
      try
            IdTCPClient1.IPVersion:=Id_IPv6;// &lt;--now try IPv6
            IdTCPClient1.Connect;
            result:=true;
            ipversion:=&#39;IPv6&#39;;    // &lt;-- will tell us what ip version to use
      except
      end;
    end;
</code></pre>

<p>仅此而已。现在,该应用在我的 iPad 上的 IPv4 和 IPv6 上都能正常运行!</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/45215172/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/45215172/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误