import socket
if __name__ == '__main__':
# 创建udpsocket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置socket选项,让其允许发送广播消息
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 直接发送广播消息 255.255.255.255 : 广播地址
udp_socket.sendto("大家好".encode("gbk"), ("192.168.43.255", 7999))
# 关闭socket
udp_socket.close()
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 … … . :
本地链接 IPv6 地址… … . . : fe80::982d:fcf6:349d:ac13%8
IPv4 地址 … … … … : 192.168.43.196
子网掩码 … … … … : 255.255.255.0
默认网关… … … … . : 192.168.43.1
用上面的代码编译之后,广播失败,原因是开始的广播地址写的是255.255.255.255,广播地址是通过计算而得,而不是简单的一成不变的255.255.255.255,
广播域计算
用主机的IP地址与子网掩码进行与运算即可知道该主机属于哪一个广播域。例如:一台主机的IP地址为192.168.23.150,子网掩码为255.255.255.0,那么它所属的广播域就是192.168.23.150&255.255.255.0=192.168.23.0。那么其它的在广播域192.168.23.0内的所有主机就可以到该设备发送的广播包。如果把子网掩码改为255.255.0.0,那么它所属的广播域就是192.168.23.150&255.255.0.0=192.168.0.0。那么其它的在广播域192.168.0.0内的所有主机都可以收到该设备发送的广播包。
广播地址的计算
要想相同广播域内的其它主机能收到的广播帧,还需要在发送广播包的时候指定当前所属广播域内的广播地址。广播地址的计算方法为子网掩码取反再与广播域进行或运算。
例如:如果主机当前所属广播域为192.168.0.0,子网掩码为255.255.0.0,那么广播地址则为192.168.255.255。