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

C++(Qt)获取所有活跃网卡的 IP 地址/子网大小/网关地址的最佳实践是什么?这么常见的一个需求, Google 出来的代码竟没有一个能在 Windows 10/macOS 12 下工作

  •  
  •   rv54ntjwfm3ug8 · 2022-03-07 07:57:10 +08:00 · 2198 次点击
    这是一个创建于 1018 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不是我的问题,底下评论区也都在说 xx 系统下不能用。IP 地址 / 子网大小 /网关地址 都需要。
    Windows 下我还尝试过解析 ipconfig 输出,但发现不同系统语言下输出格式不一样。
    有 V 友做过类似的东西,可以分享一下思路(最好附上代码)么?
    13 条回复    2022-03-07 12:30:11 +08:00
    cwaken
        1
    cwaken  
       2022-03-07 08:11:33 +08:00 via iPhone
    这东西是单独分开写的呀
    rv54ntjwfm3ug8
        2
    rv54ntjwfm3ug8  
    OP
       2022-03-07 08:16:39 +08:00
    @cwaken #1 有办法一套代码兼容 Windows/Linux/macOS 么
    msg7086
        3
    msg7086  
       2022-03-07 08:18:05 +08:00   ❤️ 1
    你得去看系统调用,每个系统的系统调用不一样的,你得问内核拿到网络栈的信息。
    Windows 下应该是用 GetAdaptersAddresses 系统调用吧。

    如果要同时在多个操作系统下工作,那也简单,写一个库,根据平台编译出调用不同的系统调用的代码就行了。
    至于有没有现成的库我就不知道了。
    cwaken
        4
    cwaken  
       2022-03-07 08:42:18 +08:00 via iPhone
    @theklf4 写进程序里的都叫一套代码,只是不同系统不同运行,mac 要写 oc
    yolee599
        5
    yolee599  
       2022-03-07 08:50:07 +08:00 via Android
    有一个功能叫“条件编译”,只能分不同的平台来分别编译了
    elfive
        6
    elfive  
       2022-03-07 09:00:11 +08:00 via iPhone
    系统 API➕条件编译
    hhjuteman
        7
    hhjuteman  
       2022-03-07 09:23:11 +08:00
    每个平台不一样,qt 好像没有统一 api 。

    https://github.com/paullouisageneau/libjuice/blob/62b88fb776b1a79638c683192744f3ec0b430c6f/src/udp.c#L428


    贴了个大概的参考,可以看看
    3dwelcome
        8
    3dwelcome  
       2022-03-07 09:39:23 +08:00
    "Windows 下我还尝试过解析 ipconfig 输出"

    我也是用这种方法,比自己去调用 API 简单多了。

    只要做中文和英文解析,就足够了。
    krixaar
        9
    krixaar  
       2022-03-07 09:52:41 +08:00   ❤️ 1
    @3dwelcome #8 我之前为了偷懒先 chcp 65001 然后输出就变英文了,不知道其它语言里是不是这样,至少简中 win10 可以
    3dwelcome
        10
    3dwelcome  
       2022-03-07 09:56:14 +08:00
    @krixaar 还有这种方法?学到了!
    nieyujiang
        11
    nieyujiang  
       2022-03-07 10:03:38 +08:00 via iPhone
    @theklf4 #2 没有,但凡是跨平台的东西,不存在一套代码适配所有平台。上层调用可以统一,底层的实现一个系统一个样。甚至机制和原理都不一样。咋统一。🐶
    ysc3839
        12
    ysc3839  
       2022-03-07 10:08:50 +08:00 via Android
    最佳实践是去找各系统官方的 sample 代码。比如前面有人提到的 GetAdaptersAddresses ,微软文档里就有代码 https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses
    不知道楼主怎么得出标题所述的结论的
    learningman
        13
    learningman  
       2022-03-07 12:30:11 +08:00
    要适配多系统,只能#ifdef 一个一个写了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5978 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.