Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当机器有多个网卡时检测实际IP地址_Python_Sockets - Fatal编程技术网

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”的模块