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

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

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

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


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

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

只要做中文和英文解析,就足够了。
krixaar
2022-03-07 09:52:41 +08:00
@3dwelcome #8 我之前为了偷懒先 chcp 65001 然后输出就变英文了,不知道其它语言里是不是这样,至少简中 win10 可以
3dwelcome
2022-03-07 09:56:14 +08:00
@krixaar 还有这种方法?学到了!
nieyujiang
2022-03-07 10:03:38 +08:00
@theklf4 #2 没有,但凡是跨平台的东西,不存在一套代码适配所有平台。上层调用可以统一,底层的实现一个系统一个样。甚至机制和原理都不一样。咋统一。🐶
ysc3839
2022-03-07 10:08:50 +08:00
最佳实践是去找各系统官方的 sample 代码。比如前面有人提到的 GetAdaptersAddresses ,微软文档里就有代码 https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses
不知道楼主怎么得出标题所述的结论的
learningman
2022-03-07 12:30:11 +08:00
要适配多系统,只能#ifdef 一个一个写了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX