Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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_Network Programming - Fatal编程技术网

无法获取网络';用Python';IP地址模块

无法获取网络';用Python';IP地址模块,python,network-programming,Python,Network Programming,这是获取网络广播地址的代码: def get_broadcast_address(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) ip_addr = ipaddress.IPv4Network(s.getsockname()[0]) ip_address = ipaddress.IPv4Network(s.getsockname

这是获取网络广播地址的代码:

def get_broadcast_address():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    ip_addr = ipaddress.IPv4Network(s.getsockname()[0])
    ip_address = ipaddress.IPv4Network(s.getsockname()[0] + "/" + str(ip_addr.netmask))
    return ip_address.broadcast_address
它首先获取本地IP,然后获取子网掩码。我知道我可以通过二进制计算来获得广播地址,但我想知道为什么上面的函数不起作用


这将输出
IPv4Address('192.168.1.47')
。我希望它输出192.168.1.255。为什么会发生这种情况?

地址
IP
可以与不同的
掩码一起使用-所有这些都取决于用户/管理员的决定和系统中的设置-您不能期望它会自动将
24
用于您的地址

套接字提供
IP
,但不提供
掩码

如果您未在
IPv4Network
(或其他命令)中设置掩码,则它将使用
32
,该命令稍后将为您提供
192.168.1.47
,而不是预期的
192.168.1.255

如果您使用
IP
手动设置
24
以创建
接口
,则可以获得预期的
网络
和预期的
广播

import socket
import ipaddress

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))

socket_ip = s.getsockname()[0]
socket_ip = '192.168.1.47'
print('socket_ip   :', socket_ip)

network = ipaddress.IPv4Network(socket_ip)
print('network     :', network)
print('network mask:', network.netmask)

print('---')
mask = str(network.netmask)
print('mask:', mask)
ip_address = ipaddress.IPv4Interface(socket_ip + "/" + mask)
print('ip_address:', ip_address)
print('network   :', ip_address.network)
print('broadcast :', ip_address.network.broadcast_address)

print('---')
mask = '24'
print('mask:', mask)
ip_address = ipaddress.IPv4Interface(socket_ip + "/" + mask)
print('ip_address:', ip_address)
print('network   :', ip_address.network)
print('broadcast :', ip_address.network.broadcast_address)
结果

socket_ip   : 192.168.1.47
network     : 192.168.1.47/32
network mask: 255.255.255.255
---
mask: 255.255.255.255
ip_address: 192.168.1.47/32
network   : 192.168.1.47/32
broadcast : 192.168.1.47
---
mask: 24
ip_address: 192.168.1.47/24
network   : 192.168.1.0/24
broadcast : 192.168.1.255

要获得正确的掩码,您必须向系统询问此项。可以使用
psutil
或使用
subprocess
和系统命令
ipconfig
(Windows)或
ifconfig
(Linux)

但是,如果您已经安装了
psutil
,则不需要前面的方法

import psutil

for interface, data in psutil.net_if_addrs().items(): 
    addr = data[0]
    print('interface:', interface)
    print('address  :', addr.address)
    print('netmask  :', addr.netmask)
    print('broadcast:', addr.broadcast)
    print('---')
结果(对于我的Linux)


你检查过你的面具吗?我得到了
32
,但你似乎期望
24
谢谢。我被网络面具弄糊涂了。
interface: lo
address  : 127.0.0.1
netmask  : 255.0.0.0
broadcast: None
---
interface: wlp5s0
address  : 192.168.1.31
netmask  : 255.255.255.0
broadcast: 192.168.1.255
---
interface: docker0
address  : 172.17.0.1
netmask  : 255.255.0.0
broadcast: 172.17.255.255
---
interface: enp3s0
address  : 00:26:2d:84:78:64
netmask  : None
broadcast: ff:ff:ff:ff:ff:ff