sockets - python - 在机器有多个网卡时检测实际IP地址

84 3

我尝试使用此命令:


name = socket.gethostname()


address_info = socket.gethostbyname(name)



但是这会返回IP地址169.x.x.x而不是我真正的地址(192.168.x.x ),这是因为我的机器有几个network卡。

如何检测我的实际IP地址?

时间: 原作者:

128 3

你可以用netifaces,它会让你的任务更简单


import netifaces


netifaces.interfaces()



输出将是所有接口的列表


['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']



你可以更深入地了解它


netifaces.ifaddresses('en0')



输出将是-


{18: [{'addr': '00:12:34:56:78:9a'}], 2: [{'broadcast':


 '10.255.255.255', 'netmask': '255.0.0.0', 'addr': '10.16.1.4'}],


 30: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr':


 'fe80::123:4567:89ab:cdef%en0'}]}



查找接口地址


netifaces.ifaddresses('en0')[netifaces.AF_LINK]



输出


[{'addr': '00:12:34:56:78:9a'}]



你可以遍历所有接口,并且检索像这样的IP地址。-


for interface in netifaces.interfaces():


... for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:


... print link['addr']



原作者:
142 3

你可以使用netfaces包 文档

对于"真实"地址,你有点混淆,所有的网络接口都有一个或多个IP地址,它们都是真实的。

然而,如果你要选择与internet连接的特定IP地址,那么你可以选择接口,并且获取主IP地址。

也许这段代码有帮助:


import netifaces



def main():


 for item in netifaces.interfaces():


 print(netifaces.ifaddresses(item))


 print("n")



if __name__=="__main__":


 main()



如果要了解面向接口的外部网络,请使用以下代码:


print(netifaces.gateways()['default'][netifaces.AF_INET][0])



原作者:
117 2

这对你有用吗?


from pyroute2 import IPRoute



with IPRoute() as ipr:


 op = ipr.route('get', dst='8.8.8.8') #Find route to the google dns server


 for tup in op[0]['attrs']:


 if tup[0] == 'RTA_PREFSRC': # Preferred source address will be your ip address


 print(tup[1])



原作者:
82 2

你可以用这种方法解决这个问题。


import socket



def my_ip():


 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


 try:


 s.connect(('stackoverflow.com', 1027))


 except socket.error:


 return None


 return s.getsockname()[0]



原作者:
...