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

用户名

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

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-取决于用户/管理员的决定和系统中的设置-您不能期望它会自动24用于您的地址。

套接字给IP但不给mask

如果您未在IPv4Network(或其他命令)中设置mask,它将32在以后使用192.168.1.47而不是预期的效果192.168.1.255

如果手动设置24你的IP创造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或一起使用(Windows)或(Linux)subprocessipconfigifconfig

但是,如果您已安装,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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

网络中何时使用广播MAC地址和广播IP地址?

来自分类Dev

在 Python 中从 ipaddress.IPv4Network 获取错误地址

来自分类Dev

使用Python获取连接接口的网络地址

来自分类Dev

Python:直接从网络获取CSV,导致数据无法使用

来自分类Dev

如何在MySQL上使用IP和CIDR计算网络和广播地址

来自分类Dev

使用Python查找网络(外部)IP地址

来自分类Dev

使用Python查找网络(外部)IP地址

来自分类Dev

使用JAVA从网络上的IP地址获取主机名

来自分类Dev

网络抓取python无法获取结果

来自分类Dev

获取网络类的URL地址

来自分类Dev

无法在Ubuntu 20.04 LTS上使用python接收UDP广播,只能在同一网络上的Raspbian和Centos上运行

来自分类Dev

无法在Unity中使用本机android模块(AAR文件)进行广播

来自分类Dev

使用标准库处理Python CIDR网络地址

来自分类Dev

无法获取DHCP地址

来自分类Dev

无法获取DHCP地址

来自分类Dev

使用ipaddress vs resolv在Ruby中进行IP地址验证

来自分类Dev

使用VLAN将设备与网络广播隔离

来自分类Dev

使用python从MAC获取IP地址

来自分类Dev

使用python从给定坐标获取地址

来自分类Dev

地址144.16.95.255的广播地址?

来自分类Dev

python mysql.connector 模块使用了错误的 IP 地址

来自分类Dev

查找D类IPv4的默认子网掩码,网络地址和广播地址

来自分类Dev

无法使用Python 3加载Python模块

来自分类Dev

Cython调用lapack,错误:“无法获取Python变量的地址”

来自分类Dev

无法通过广播地址接收UDP数据包,ArtNet

来自分类Dev

无法使用pcap_findalldevs获取IP地址

来自分类Dev

无法在Android中使用Geocoder从坐标中获取地址

来自分类Dev

如何从IP地址获取网络掩码?

来自分类Dev

获取移动网络的IP地址

Related 相关文章

  1. 1

    网络中何时使用广播MAC地址和广播IP地址?

  2. 2

    在 Python 中从 ipaddress.IPv4Network 获取错误地址

  3. 3

    使用Python获取连接接口的网络地址

  4. 4

    Python:直接从网络获取CSV,导致数据无法使用

  5. 5

    如何在MySQL上使用IP和CIDR计算网络和广播地址

  6. 6

    使用Python查找网络(外部)IP地址

  7. 7

    使用Python查找网络(外部)IP地址

  8. 8

    使用JAVA从网络上的IP地址获取主机名

  9. 9

    网络抓取python无法获取结果

  10. 10

    获取网络类的URL地址

  11. 11

    无法在Ubuntu 20.04 LTS上使用python接收UDP广播,只能在同一网络上的Raspbian和Centos上运行

  12. 12

    无法在Unity中使用本机android模块(AAR文件)进行广播

  13. 13

    使用标准库处理Python CIDR网络地址

  14. 14

    无法获取DHCP地址

  15. 15

    无法获取DHCP地址

  16. 16

    使用ipaddress vs resolv在Ruby中进行IP地址验证

  17. 17

    使用VLAN将设备与网络广播隔离

  18. 18

    使用python从MAC获取IP地址

  19. 19

    使用python从给定坐标获取地址

  20. 20

    地址144.16.95.255的广播地址?

  21. 21

    python mysql.connector 模块使用了错误的 IP 地址

  22. 22

    查找D类IPv4的默认子网掩码,网络地址和广播地址

  23. 23

    无法使用Python 3加载Python模块

  24. 24

    Cython调用lapack,错误:“无法获取Python变量的地址”

  25. 25

    无法通过广播地址接收UDP数据包,ArtNet

  26. 26

    无法使用pcap_findalldevs获取IP地址

  27. 27

    无法在Android中使用Geocoder从坐标中获取地址

  28. 28

    如何从IP地址获取网络掩码?

  29. 29

    获取移动网络的IP地址

热门标签

归档