Python 中 socket 模块的 gethostbyname 和 getaddrinfo 有什么区别?
我现在想将域名解析成 IP 地址,请问使用 socket.gethostbyname 和 socket.getaddrinfo 的有什么区别?
Python 中 socket 模块的 gethostbyname 和 getaddrinfo 有什么区别?
2 回复
socket.gethostbyname() 和 socket.getaddrinfo() 都是用来做域名解析的,但区别挺大的。
简单说,gethostbyname() 是老古董,只返回IPv4地址(一个字符串)。getaddrinfo() 是现代方法,功能全面得多。
看代码最直接:
import socket
# 1. gethostbyname - 只返回IPv4地址
try:
ipv4 = socket.gethostbyname('www.baidu.com')
print(f"gethostbyname 结果: {ipv4}")
except socket.gaierror as e:
print(f"gethostbyname 错误: {e}")
# 2. getaddrinfo - 返回详细信息列表
try:
# 参数: (主机名, 端口, 地址族, 类型, 协议, 标志)
# 返回: [(地址族, 类型, 协议, 规范名, 地址), ...]
results = socket.getaddrinfo('www.baidu.com', 80,
family=socket.AF_UNSPEC, # IPv4和IPv6都支持
type=socket.SOCK_STREAM) # 流式socket
print("\ngetaddrinfo 结果:")
for result in results:
family, socktype, proto, canonname, sockaddr = result
print(f" 地址族: {family}, 类型: {socktype}, 地址: {sockaddr[0]}")
except socket.gaierror as e:
print(f"getaddrinfo 错误: {e}")
主要区别:
- 协议支持:
gethostbyname只支持IPv4,getaddrinfo支持IPv4和IPv6 - 返回格式:
gethostbyname返回字符串,getaddrinfo返回元组列表,包含地址族、socket类型等信息 - 端口信息:
getaddrinfo可以同时解析主机名和端口,直接用于socket连接 - 过滤选项:
getaddrinfo可以指定地址族、socket类型等
现在基本都用 getaddrinfo,除非你明确只需要IPv4并且想少写点代码。
总结:新项目无脑用 getaddrinfo。

