【问题标题】:Python can't send a broadcast package with <broadcast> addressPython 无法发送带有 <broadcast> 地址的广播包
【发布时间】:2014-11-17 16:17:55
【问题描述】:

接下来的代码发送广播包(在本地Wireshark中查看):

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
reqdata = struct.pack('<l', 0x01)
s.sendto( reqdata, ( '192.168.1.255', port ))

但是当我在尖括号中写“广播”而不是恒定的子网广播时,包没有被发送:

s.sendto( reqdata, ( '<broadcast>', port ))

环境:

ActivePython 2.7.5.6(ActiveState 软件公司)
基于 Python 2.7.5(默认,2013 年 9 月 16 日,23:16:52)
[MSC v.1500 32 bit (Intel)] on win32"

【问题讨论】:

  • 你为什么要使用那种语法?
  • 因为我想使用通用广播。如果我不知道子网掩码和子网地址。例如,在我的情况下,掩码是 255.255.255.0,子网是 192.168.1.0。但是如果掩码是 255.255.0.0,子网是 192.168.0.0,广播应该是 192.168.255.255。这种语法在文档中描述,所以我认为它应该可以工作。还是没有?
  • 我认为这只是一个占位符,意味着它是对用户的练习。我不记得如何获得位掩码,但是当你得到它时,你会明智地将它和/或它转换为主机 IP 地址。

标签: python broadcast


【解决方案1】:

Python 支持'&lt;broadcast&gt;',见socket — Low-level networking interface

但是,您可以使用 ipaddress 包获取网络设备的广播掩码

import ipaddress
import socket

netmask = '255.255.255.0'  # Netmask is to decode network and host addresses

ip  = socket.gethostbyname(socket.gethostname())  # Obtain your IP address
net = ipaddress.IPv4Network(ip + '/' + netmask, False)
broadcast = str(net.broadcast_address)

print('My broadcast address =', broadcast)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 2014-08-09
    • 2021-01-11
    • 2012-10-06
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多