Python 当机器有多个网卡时检测实际IP地址
我尝试使用以下命令:Python 当机器有多个网卡时检测实际IP地址,python,sockets,Python,Sockets,我尝试使用以下命令: name=socket.gethostname() 地址\u info=socket.gethostbyname(名称) 但这会返回IP地址169.x.x.x,而不是我的真实地址(192.168.x.x),这是因为我的机器有几个网络卡 如何检测我的真实IP地址?您可以使用。这会使你的任务更简单 import netifaces netifaces.interfaces() 输出将是所有接口的列表 ['lo0', 'gif0', 'stf0', 'en0', 'en1',
name=socket.gethostname()
地址\u info=socket.gethostbyname(名称)
但这会返回IP地址169.x.x.x
,而不是我的真实地址(192.168.x.x
),这是因为我的机器有几个网络
卡
如何检测我的真实IP地址?您可以使用。这会使你的任务更简单
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']
你可以用。这会使你的任务更简单
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']
您可以使用netifaces软件包: 您对“真实”地址的含义存在混淆,所有网络接口都有权使用一个或多个IP地址,并且它们是真实的 但是,如果您想选择一个特定的IP地址,将您连接到internet等,那么您可以选择接口并获取其主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])
您可以使用netifaces软件包: 您对“真实”地址的含义存在混淆,所有网络接口都有权使用一个或多个IP地址,并且它们是真实的 但是,如果您想选择一个特定的IP地址,将您连接到internet等,那么您可以选择接口并获取其主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])
也许你可以这样解决这个问题
导入套接字
定义my_ip():
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
尝试:
s、 连接(('stackoverflow.com',1027))
除socket.error外:
一无所获
返回s.getsockname()[0]
也许你可以用这种方法解决这个问题
导入套接字
定义my_ip():
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
尝试:
s、 连接(('stackoverflow.com',1027))
除socket.error外:
一无所获
返回s.getsockname()[0]
这对你有用吗
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])
这对你有用吗
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])
你愿意使用NetFaces吗?你是什么意思?我只是想解决这个问题。请尝试我最近编辑的代码片段,它非常适合你;)你愿意使用NetFaces吗?你是什么意思?我只是想解决这个问题。请尝试我最近编辑的代码片段,它非常适合你;)但是我如何自动确定连接到internet的ip地址呢?(我的列表中有4个不同的地址)我只需要IPv4地址,但如何自动确定连接到internet的ip地址?(我的列表中有4个不同的地址)我只想要IPv4地址它不需要,很可能OP在NAT后面,并且使用私有IP地址;这个问题也不涉及环境的公共IP。在我有了这个getway之后,我如何才能获得代表这个getway的IP地址?请运行最后一个代码段,它将打印出默认网关的IP地址。你能分享你所看到的吗?不需要,OP很可能在NAT后面,使用一个私有IP地址;这个问题也不涉及环境的公共IP。在我有了这个getway之后,我如何才能获得代表这个getway的IP地址?请运行最后一个代码段,它将打印出默认网关的IP地址。你能分享你看到的吗?如果我想得到内部ip地址,我很抱歉我把问题搞错了。我将实际IP地址理解为外部IP地址。我希望我的答案能解决这个问题。如果我想得到内部ip地址,我很抱歉我答错了。我将实际IP地址理解为外部IP地址。我希望我编辑的答案能够解决问题。我安装了pyroute2,但我有以下错误:ModuleNotFoundError:没有名为“win\u inet\u pton”的模块我安装了pyroute2,但我有以下错误:ModuleNotFoundError:没有名为“win\u inet\u pton”的模块