获取当前设备的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
相关推荐
luj_17686 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
吴懿不在6 小时前
某次热身赛re方向wp WORDS 51,500 READ 172 MIN base64,
网络
深圳恒讯9 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者9 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn9 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络
2603_9547083111 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全
其实防守也摸鱼11 小时前
蓝队相关知识学习(1)---常用堡垒机和服务器
服务器·功能测试·学习·网络安全·网络攻击模型·攻防对抗·蓝队
青岛前景互联信息技术有限公司12 小时前
以新标准为底座,前景互联打造高危场景智能接处警新体系
大数据·网络·人工智能
大飞记Python12 小时前
Linux命令速查手册(测试开发4年实战总结,附PDF)
linux·网络·pdf
AFinalStone12 小时前
Android 7系统网络(四)Native层(下)—netd Controller详解
android·网络