繁体   English   中英

无法使用 Python 的 Ipaddress 模块获取网络的广播地址

[英]Unable to get the network's broadcast address with Python's Ipaddress module

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

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,然后是子网掩码。 我知道我可以进行二进制计算以获得广播地址,但我想知道为什么上面的 function 不起作用。

这将输出IPv4Address('192.168.1.47') 我希望它是 output 192.168.1.255。 为什么会这样?

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

套接字提供IP但它不提供mask

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

如果您使用IP手动设置24来创建Interface ,那么您可以获得预期的network和预期的broadcast

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或使用带有系统命令ipconfig (Windows) 或ifconfig (Linux) 的subprocess进程

但是如果你已经安装了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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM