在套接字库(Python)中获取错误的IP-[从另一个适配器获取信息]



我正在使用这个简单的代码:

>>> import socket
>>> socket.gethostbyname(socket.gethostname())
'192.168.160.1'

问题是这给了我错误的IP。做一个简单的ipconfig,我发现它给了我来自另一个适配器(与VMWARE相关(的信息:

Adaptador de Ethernet VMware Network Adapter VMnet8:
Dirección IPv4. . . . . . . . . . . . . . : 192.168.160.1
Adaptador de LAN inalámbrica Wi-Fi:
Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.51

我通过禁用VMware Network Adapter VMnet8解决了这个问题。有办法避免这种情况吗?感谢阅读

Python 3.8.6
Vmware 16.0.0.63036

您似乎正在尝试查找用于internet访问的网络接口的IP地址?

假设你真的连接到了互联网,这样的事情会让你明白:

import socket
# create an datagram socket (single UDP request and response, then close)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# connect to an address on the internet, that's likely to always be up 
# (the Google primary DNS is a good bet)
sock.connect(("8.8.8.8", 80))
# after connecting, the socket will have the IP in its address
print(sock.getsockname())
# done
sock.close()

结果(在我的电脑上,你的应该与你自己的匹配(:

('192.168.0.132', 56618)

注意:这取决于是否有活动的互联网连接,以及您要连接的服务是否接受连接。这在没有互联网连接的内部网络上不起作用,除非你试图连接到一个可以可靠连接的地址(例如路由器的管理界面(

您可以获取netifaces包来获取特定网络适配器的IP地址:

import netifaces as ni
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print(ip)

您可以使用任何接口来代替"eth0">

我用Wasif Hasan推荐的netifaces包找到了一个解决方案,它也可以是通用的。

import netifaces as ni
x = ni.gateways() 
y = x['default'][2][1] 
ip = ni.ifaddresses(y)[ni.AF_INET][0]['addr']

最新更新