Python 获取本机 IP 的优雅实现:基于 UDP 连接的方法

Elena
Elena
发布时间:2026-10-12| 4人浏览过
原创

本文对比了通过猜测网络接口或使用 hostname 反查 IP 的常见但不可靠的方法,重点介绍了一种基于 UDP 协议的优雅获取本机 IP 的方案。该方法无需依赖特定网络设备名,通过建立 UDP 连接获取本地 socket 地址即可得到 IP,且不会真正发送数据包。文章提供了完整的 Python 代码实现及性能优化建议。

在开发过程中,我们常遇到获取服务器本地 IP 的需求。然而,许多现有的代码实现并不理想,例如以下几种常见方式往往存在局限性。

不推荐:依赖猜测网络接口的获取方式

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import fcntl
import struct

def get_ip_address(ifname):
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  return socket.inet_ntoa(fcntl.ioctl(
    s.fileno(),
    0x8915, # SIOCGIFADDR
    struct.pack('256s', ifname[:15])
  )[20:24])

print "br1 = "+ get_ip_address('br1')
print "lo = " + get_ip_address('lo')
print "virbr0 = " + get_ip_address('virbr0')

这类代码的核心逻辑包含了对网络设备的猜测行为。

如果服务器仅配置了 eth0 或 bond0 等单一接口且有 IP 地址,此类猜测代码极易失败,且难以移植到其他平台或异构环境中。

不推荐:通过 hostname 反查本机 IP

import socket
print(socket.gethostbyname(socket.gethostname()))

# 有可能出现这个情况
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known

该方法首先获取主机名(hostname),再根据主机名反向解析出 IP 地址。由于许多服务器并未规范设置 hostname,因此这种方法也不被推荐。

此外,部分服务器会在 /etc/hosts 文件中手动添加本机 hostname 对应的地址。虽然这种做法可行,但如果错误地将其设置为 127.0.0.1,则获取到的 IP 将始终是回环地址,导致结果错误。

基于 UDP 协议获取本机 IP:目前最优雅的方案

这是目前所见获取服务器 IP 最为优雅的方法。它不依赖任何外部库,也不需要对机器上的网络设备信息进行猜测。

其原理是利用 UDP 协议:构造一个 UDP 数据包,将本机 IP 信息放入 UDP 协议头中,随后从该 UDP 包中提取本机的 IP 地址。

需要注意的是,此方法并不会真正向外部发送数据包,因此使用抓包工具无法观察到流量。但它会申请一个 UDP 端口,若频繁调用可能会消耗一定时间。建议将查询到的 IP 进行缓存,以显著提升性能。

# 在 shell 中可以一行调用,获取到本机IP
python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"
10.12.189.16

# 可以封装成函数,方便 Python 的程序调用
import socket

def get_host_ip():
  try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('8.8.8.8', 80))
    ip = s.getsockname()[0]
  finally:
    s.close()

  return ip

以上就是本文的全部内容,希望能为您的学习提供帮助,也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。