无法使用 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,再获取子网掩码。我知道我可以通过二进制计算来获取广播地址,但我想知道为什么上面的函数不起作用。
这输出 IPv4Address('192.168.1.47')
。我希望它输出 192.168.1.255。为什么会这样?
地址 IP
可以与不同的 masks
一起使用 - 全部取决于 user/admin 决定和系统中的设置 - 你不能指望它会自动使用 24
为您的地址。
Socket 提供 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
或使用 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)
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
这是我获取网络广播地址的代码:
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
可以与不同的 masks
一起使用 - 全部取决于 user/admin 决定和系统中的设置 - 你不能指望它会自动使用 24
为您的地址。
Socket 提供 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
或使用 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)
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