python getaddrinfo()解析地址

函数说明

解析地址

getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
参数
  • host:主机
  • port:端口
返回

返回元组,形式为(family, sockettype, proto, canonname, sockaddr)

  • family:表示socket使用的协议簇。常用的协议簇包括AF_UNIX(本机通信)/AF_INET(TCP/IP协议簇中的IPv4协议)/AF_INET6(TCP/IP协议簇中的IPv4协议)

  • sockettype:表示socket的类型。常见的socket类型包括SOCK_STREAM(TCP流)/SOCK_DGRAM(UDP数据报)/SOCK_RAW(原始套接字)

  • proto:指定协议。套接口所用的协议。如调用者不想指定,可用0。常用的协议有,IPPROTO_TCP(=6)和IPPTOTO_UDP(=17),它们分别对应TCP传输协议、UDP传输协议

  • sockaddr

    • IPV4协议时,格式为:(IP address, port)形式的元组
    • IPV6协议时,格式为:(address, port, flow info, scope id)形式的元组

也就是说,不管是IPV4还是IPV6,上面的函数都可以正确地获取IP地址。

例子

import socket
#获取本机电脑名
hostname = socket.gethostname()
addrs = socket.getaddrinfo(hostname,None)
for item in addrs:
    print(item)

结果如下:

(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('fe80::9d22:2600:642c:8f9c%18', 0, 0, 18))
(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('fe80::9c7c:22a4:7fbd:2fca%4', 0, 0, 4))
(<AddressFamily.AF_INET: 2>, 0, 0, '', ('192.168.56.1', 0))
(<AddressFamily.AF_INET: 2>, 0, 0, '', ('172.20.10.4', 0))

获取IPv4地址

指定IPv4族

import socket
#获取本机电脑名
hostname = socket.gethostname()
addrs = socket.getaddrinfo(hostname,None,family=socket.AF_INET)
for item in addrs:
    print(item[4][0])

结果:

192.168.56.1
172.20.10.4

感谢文章:
https://blog.csdn.net/dongfuguo/article/details/74497131
https://www.cnblogs.com/sunada2005/archive/2013/05/28/3103953.html


原文出处:/show_1EF3BTIm7Vtv.html