组播方案在路由器不支持的情况下也无法穿透路由,需要考虑其他方案,目前除了单点遍历查询外还没找到其他办法。
设备上实现组播监听
#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'发送到多播地址的指定端口,属于这个多播组的成员都可以收
到这个信息