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}")

主要区别:

  1. 协议支持gethostbyname 只支持IPv4,getaddrinfo 支持IPv4和IPv6
  2. 返回格式gethostbyname 返回字符串,getaddrinfo 返回元组列表,包含地址族、socket类型等信息
  3. 端口信息getaddrinfo 可以同时解析主机名和端口,直接用于socket连接
  4. 过滤选项getaddrinfo 可以指定地址族、socket类型等

现在基本都用 getaddrinfo,除非你明确只需要IPv4并且想少写点代码。

总结:新项目无脑用 getaddrinfo。


回到顶部