本文共 2082 字,大约阅读时间需要 6 分钟。
一、组播技术说明
个人对组播的理解
标准解释相对清晰,但在实际应用中存在许多问题。例如,组播地址是否直接对应物理设备?在组播数据包被发送后,如何决定目标主机?这些问题需要结合实际测试和深入理解网络协议来解答。组播技术的工作原理
从底层技术来看,组播数据包与普通UDP数据包的区别仅在于其目的IP地址为组播保留IP。具体流程如下:setsockopt加入组播组,启动对应端口的UDP监听进程才能接收到组播数据包。setsockopt加入组播组234.2.2.2,并启动对应端口23456的UDP监听。二、组播程序实现
import timeimport socketmcast_group_ip = '234.2.2.2'mcast_group_port = 23456def sender(): send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) while True: message = "this message send via mcast !" send_sock.sendto(message.encode(), (mcast_group_ip, mcast_group_port)) print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}: message send finish") time.sleep(10)if __name__ == "__main__": sender() import structimport timeimport socketmcast_group_ip = '234.2.2.2'mcast_group_port = 23456def receiver(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) local_ip = socket.gethostbyname(socket.gethostname()) sock.bind((local_ip, mcast_group_port)) mreq = struct.pack("=4sl", socket.inet_aton(mcast_group_ip), socket.INADDR_ANY) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) while True: try: message, addr = sock.recvfrom(1024) print(f"{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}: Receive data from {addr}: {message.decode()}") except: print("while receive message error occur")if __name__ == "__main__": receiver() 这段代码实现了一个简单的组播通信系统。发送者定期发送组播数据包,接收者通过加入组播组并监听特定端口接收数据包。
转载地址:http://wblfk.baihongyu.com/