• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:19:27 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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

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

客户端(移动应用): - TSQLConnection(Datasnap 驱动程序。通信协议(protocol):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)上进行更改

有什么办法吗?



Best Answer-推荐答案


我明白了

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

可以使用以下参数配置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 上都能正常运行!

关于ios - 使用 IPv6 (iOS) 的 Delphi Datasnap 连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45215172/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap