获取当前设备的IP

背景:

  在本地使用自带webUI的项目时,需要制定webUI的访问地址。

  • 一般本地访问使用:127.0.0.1,
  • 配置为可以从其他设备访问时,需要指定当前设备的IP,或者指定为0.0.0.0。

  例如:使用locust的时候,因为某些特殊原因,我的电脑名称中有中文字符。当指定webUI访问地址指定为0.0.0.0时,locust webUI 会调用的 pywsgi.WSGIServer 服务。

  初始化启动时,因为指定的IP时0.0.0.0, 会调用socket.getfqdn()方法。由于电脑名为中文,会由于默认的ascii编码方式,导致抛出异常。

  从代码逻辑上讲,我们指定了0.0.0.0后,会先调用socket.gethostname(),然后通过设备名称获取IP地址。本质上还是重新指定IP。

如果我们一开始就指定为设备的IP,会更有效率。

获取设备IP的方法:

  • 以下方法的使用都是基于当前设备已经连接网络。

方法一:

使用 socket 方法:

python 复制代码
def current_ip():
    ip = None
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    client.connect(('8.8.8.8', 80))
    ip,port  = client.getsockname()
    print(f'ip: {ip}')
    return ip

方法二:

使用 psutil 方法:

  1. kind='inet4'指定过滤出IPv4的连接

  2. 通过连接类型SOCK_STREAM、状态不为None、连接的远端IP不为空且不为127.0.0.1

    python 复制代码
    def current_ip():
        import psutil
        ip = None
        interfaces = psutil.net_connections(kind='inet4')
        for interface in interfaces:
            if interface.type == socket.SocketKind.SOCK_STREAM and interface.status is not None and bool(interface.raddr):
                if interface.raddr.ip != "127.0.0.1":
                    print(interface.laddr.ip)
                    ip = interface.laddr.ip
                break
        return ip
相关推荐
余额瞒着我当琳3 小时前
Linux初识:Linux的历史,计算机的发展脉络,发行版本,选购云服务器,安装Xshell,第一次连接,基础命令指南
linux·运维·服务器
lazy H3 小时前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
垆边人似月.3 小时前
RDMA 文件传输踩坑(四):从固定延时改造为 READY/ACK 协议
linux·服务器·网络
服务器硬件项目经理4 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
乐维_lwops4 小时前
汽车集团网管平台建设案例:乐维网管工具实现跨区域网络统一监控与链路可视化
网络·网管平台·it监控·链路·统一监控
程序猿老A4 小时前
轻量应用服务器怎么搭建 WordPress站点?
服务器
snysy5 小时前
服务器安全加固与入侵检测实战:从SSH加固、防火墙策略到挖矿木马排查
服务器·安全·ssh
运维行者_5 小时前
供应链安全成最大风险源,企业如何构建可控的运维体系?
运维·开发语言·网络·数据库·安全·云计算·流量监控
pt10435 小时前
Cisco设备网络安全系列-20:DevSecOps集成
网络·安全·架构
IT古董5 小时前
Modbus TCP 详解:工业设备通信协议与 MES 集成实战
网络·网络协议·tcp/ip