C++(Qt)获取所有活跃网卡的 IP 地址/子网大小/网关地址的最佳实践是什么?这么常见的一个需求, Google 出来的代码竟没有一个能在 Windows 10/macOS 12 下工作 - V2EX
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 2544 次点击
    这是一个创建于 1380 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不是我的问题,底下评论区也都在说 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  
       
    每个平台不一样,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 还有这种方法?学到了!
    ZeoKarl
        11
    ZeoKarl  
       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     Solana     878 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 21:14 PVG 05:14 LAX 13:14 JFK 16:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86