Python can't send a broadcast package with <broadcast> address

大城市里の小女人 提交于 2019-12-10 12:16:38

问题


The next code sends broadcast package (checked in local 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 ))

But when I write "broadcast" in angle brackets instead of constant subnet broadcast, the package is not being sent:

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

Environment:

ActivePython 2.7.5.6 (ActiveState Software Inc.)
based on Python 2.7.5 (default, Sep 16 2013, 23:16:52)
[MSC v.1500 32 bit (Intel)] on win32"


回答1:


Python supports '<broadcast>', see socket — Low-level networking interface

However, you can get broadcast mask of your network device using ipaddress package

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)


来源:https://stackoverflow.com/questions/25995425/python-cant-send-a-broadcast-package-with-broadcast-address

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!