搬运一段 Python 获取局域网 IP 的方法,十分优雅!

2021-10-19 20:27:28 +08:00
 starsky007

代码

获取局域网 IP,一般做法是先枚举网卡、再获取 IP,但是这种做法的缺点是,不够便携,在不同的机器上需要不同的配置,代码实现上也比较啰嗦。这里搬运一段来自 Stack Overflow 的代码,适用性强、十分优雅。使用 Python 实现,我也就发在 Python 节点了,其他语言也可以借鉴。

import socket
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # doesn't even have to be reachable
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except Exception:
        IP = '127.0.0.1'
    finally:
        s.close()
    return IP

来源: networking - Finding local IP addresses using Python's stdlib - Stack Overflow

应用场景

比如,DDNS 客户端,如果想要为局域网 IP 绑定域名,往往需要人工选择网卡或者正则表达式匹配域名,我见过的几个 DDNS 客户端比如 No-IP Dynamic Update ClientNewFuture/DDNS 都是这么做的,一般 DDNS 客户端则不支持使用局域网 IP 。如果使用上述代码或思路,就可以方便获取局域网 IP 、简化程序设计、简化用户配置。

5692 次点击
所在节点    Python
27 条回复
Wincer
2021-10-20 10:42:07 +08:00
试试 psutil 这个库
starsky007
2021-10-20 11:34:47 +08:00
@ungrown
@Wincer
需求不就是方便快捷地获取默认主 IP 吗?
julyclyde
2021-10-20 12:16:24 +08:00
我们这里都是用 magic number 8915 的,嘿嘿
然后到 mac 上就不行了
exiaohao
2021-10-20 12:24:17 +08:00
这个面对大多数情况应该是够了吧,而且是挺巧妙的
但是如果对 10.255.255.255 这个地址 有什么策略路由或者走的网卡不一样可能会有不一样的结果?赶脚还能用来探测不同地址的不同路由 hh
skinny
2021-10-20 13:37:40 +08:00
@starsky007 原帖说的是广播地址就可以,因为程序不能直接使用广播地址。并不是说一定要 10.255.255.255
ZeroDu
2021-10-21 09:57:11 +08:00
这个不错,在 java 里面怎么实现?
vanton
2021-11-09 15:52:28 +08:00
本地目录装个 psutil ,然后直接用 psutil.net_if_addrs() 不就得了。

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

https://tanronggui.xyz/t/809003

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

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

© 2021 V2EX