组播方案在路由器不支持的情况下也无法穿透路由,需要考虑其他方案,目前除了单点遍历查询外还没找到其他办法。
设备上实现组播监听
#coding:utf-8,
from socket import *
import time
def start_listen():
ANY = '0.0.0.0'
MCAST_ADDR = '224.168.2.9'
MCAST_PORT = 1600
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) #创建UDP socket
sock.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #允许端口复用
sock.bind((ANY,MCAST_PORT)) #绑定监听多播数据包的端口
sock.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 255) #告诉内核这是一个多播类型的socket
status = sock.setsockopt(IPPROTO_IP, #告诉内核把自己加入指定的多播组,组地址由第三个参数指定
IP_ADD_MEMBERSHIP,
inet_aton(MCAST_ADDR) + inet_aton(ANY));
#sock.setblocking(0)
ts = time.time()
while 1:
try:
data, addr = sock.recvfrom(1024)
print("recv:",data,addr)
except error:
print("error ",error)
start_listen()
windows客户端加入组播并发送组播消息
#coding:utf-8,
from socket import *
import time
ANY = '0.0.0.0'
SENDERPORT=1501
MCAST_ADDR = '224.168.2.9'
MCAST_PORT = 1600
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
#sock.bind((ANY,SENDERPORT)) #绑定发送端口到SENDERPORT,即此例的发送端口为1501
sock.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 255) #设置使用多播发送
while 1:
time.sleep(1)
sock.sendto('Hello World'.encode("utf8"), (MCAST_ADDR,MCAST_PORT) );
#将'hello world'发送到多播地址的指定端口,属于这个多播组的成员都可以收
到这个信息
浙公网安备 33010602011771号