概述
向本 局域网 内 所有电脑 发送数据,但不能发到 广域网,也不能 跨网络传输(不会被路由器转发),否则会引起 网络瘫痪。
广播地址与单播不同,是<broadcast>或者255.255.255.255
要指明接收者的 端口号
参见:
http://www.malaoshi.top/show_1EF3BqD8BiSi.html#设置套接字选项和值
代码实现
在若干台电脑上执行下面接收代码(普通接收代码)
#coding=utf-8
import socket
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
udp.bind(('0.0.0.0',8000))
while True:
data,addr=udp.recvfrom(1024)
print('来自%s:%d的消息::%s'%(addr[0],addr[1],data.decode('utf-8')))
在另一台电脑上执行下面 广播 代码
(多网卡可能不好使)
#coding=utf-8
import socket
#广播地址,表示向本局域网所有电脑发送,下面两个地址都可以
#addr='<broadcast>'
addr='255.255.255.255'
port=8000
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
#下面这行代码允许发送广播数据
udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
data='所有电脑注意,测试广播'.encode('UTF-8')
udp.sendto(data,(addr,port))
以广播的形式发送数据到本局域网的所有电脑
多网卡广播
提出问题
如上图,现在笔记本一般都有wifi网卡和以太网卡(有线网卡),
- 以太网卡 在一个局域网中,
- wifi网卡 连接各自的 手机热点,所以两台计算机的wifi网卡 不在一个局域网 中
使用上面的代码实现 UDP广播,有可能是用 wifi网卡 进行 广播,而wifi网卡 不在一个局域网 中,所以 对方收不到数据
解决问题思路
- 获取所有网卡的ip地址
- 绑定第一个网卡的ip地址,进行广播
- 绑定第二个网卡的ip地址,进行广播
如果有更多的网卡,绑定第n个网卡的ip地址,进行广播
实现
#coding=utf-8
import socket
#广播地址,表示向本局域网所有电脑发送,下面两个地址都可以
#addr='<broadcast>'
addr='255.255.255.255'
port=8000
def getips():
'''
获取本机所有ipv4的ip地址
'''
ips=[]
hostname = socket.gethostname()
addrs = socket.getaddrinfo(hostname,None,family=socket.AF_INET)
for item in addrs:
ips.append(item[4][0])
return ips
def broadcast(ip,port):
'''
广播
'''
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp:
udp.bind((ip,port))
#下面这行代码允许发送广播数据
udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
data='所有电脑注意,测试广播'.encode('UTF-8')
# data=b'abc'
udp.sendto(data,(addr,port))
ips=getips()
for item in ips:
broadcast(item,port)
