V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhyf007
V2EX  ›  程序员

如何在 APP 内同时获取 IPv4 和 IPv6

  •  
  •   zhyf007 · 13 天前 · 713 次点击

    需求: 在 APP 首次安装时,调用服务端接口,上报设备 IP ( IPv4 、IPv6 )

    方案一:通过 web 服务解析请求头里的 ip ; 缺点:运维反馈路由配置要么 IPv4 优先要么 IPv6 优先,只能获取到单一的 IP

    方案二:客户端获取设备 IP 上报 缺点:只能获取到子网 IP

    方案三:通过分别接口调用,获取 IPv4 或 IPv6 后同时上报; 缺点:结合方案一、至少需要依赖额外的一次网络请求

    由于 APP 启动必须等到接口调用成功后才能继续业务操作,方案三会增加启动耗时,严重影响用户体验。

    https://ipw.cn/ 这种第三方工具网站是怎么实现的

    10 条回复    2024-06-06 15:49:07 +08:00
    llmice
        1
    llmice  
       13 天前
    做异步不行吗?
    wy315700
        2
    wy315700  
       13 天前
    https://ipw.cn/ 会分别请求
    4.ipw.cn
    6.ipw.cn
    test.ipw.cn

    分别获取 V4 和 V6 地址以及判断哪个优先
    kenvix
        3
    kenvix  
       13 天前
    优化接口,并发同时请求 ipv4-only 和 ipv6-only 的 API
    liyafe1997
        4
    liyafe1997  
       13 天前
    整俩域名,分别 v4 和 v6 only (只有 AA 或 AAAA 记录)
    zhyf007
        5
    zhyf007  
    OP
       13 天前
    @llmice
    @wy315700
    @kenvix
    @liyafe1997

    目前看来,也就只能异步请求两个接口。
    业务要求比较严格。由于服务器都部署在单一地区,全国各地不同的网络环境网络通信耗时各有不同。每增加一个接口请求,就增加业务阻塞的风险
    Yanlongli
        6
    Yanlongli  
       13 天前
    最好的是方案三
    折中是 ipv4 通过请求获取,ipv6 通过网卡获取(排除私网的 ipv6 后,一般 ipv6 都是公网 IP ,经过 nat 的 ipv6 比较少)
    esee
        7
    esee  
       13 天前
    同时获取到 v4 和 v6 肯定得两次请求,这是网络应用层决定的,你获取设备的 IP 然后上报也不一定准。另外不懂你为啥会觉得增加启动耗时,放异步执行又不影响,还是应用需要上报 ip 成功后才允许使用。
    zhyf007
        8
    zhyf007  
    OP
       12 天前
    @esee 上报 IP 后,才允许使用。所以一次请求回增加启动耗时
    cnbatch
        9
    cnbatch  
       12 天前
    能不能这样:
    先获取 IP 地址,不管是 v4 还是 v6 ,上报了再说。
    启动后,运行 1 个异步任务,已经获取到 v4 地址就尝试访问 v6 接口,已经获取到 v6 地址那就尝试访问 v4 接口。
    如果另一个地址能够获取成功,该存数据库就存数据库,该写日志就写日志。
    esee
        10
    esee  
       12 天前
    @zhyf007 不会啊,怎么会增加耗时,V4 和 V6 上报可以同时进行的。统一等待结果就行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2929 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 119ms · UTC 13:35 · PVG 21:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.