指定网卡发送组播:
multicast_sender.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
import struct
import netifaces # 确保导入 netifaces 库MCAST_GRP = '224.0.0.1' # 组播地址
MCAST_PORT = 12345 # 端口号
INTERFACE_IP = '192.168.1.10' # 指定网卡的 IP 地址# # 创建 UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定本地网卡接口用于发送组播
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(INTERFACE_IP)) # 发送组播消息
sock.sendto(b"Multicast message", (MCAST_GRP, MCAST_PORT))
发送组播到设备所有网卡 :
multicast_sender.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
import struct
import netifaces # 确保导入 netifaces 库MCAST_GRP = '224.0.0.1' # 组播地址
MCAST_PORT = 12345 # 端口号# 获取所有网络接口的 IP 地址
def get_ip_addresses():ip_addresses = {}for interface in netifaces.interfaces():# 获取每个接口的地址信息addrs = netifaces.ifaddresses(interface)if netifaces.AF_INET in addrs:for addr in addrs[netifaces.AF_INET]:ip_addresses[interface] = addr['addr']return ip_addresses# 发送组播消息
def send_multicast(interface):# 创建 UDP socketsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定本地网卡接口用于发送组播sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(interface))# 发送组播消息sock.sendto(b"Multicast message", (MCAST_GRP, MCAST_PORT))print(f"Sent multicast message from interface {interface}")def main():# 获取有 IP 地址的网络接口ip_addresses = get_ip_addresses()# 遍历所有接口并发送组播消息for iface, ip in ip_addresses.items():print(f"Interface: {iface}, IP: {ip}")send_multicast(ip)if __name__ == "__main__":main()
组播接收:
multicast_receiver.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
import structMCAST_GRP = '224.0.0.1' # 组播地址
MCAST_PORT = 12345 # 端口号# 创建 UDP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)# 允许多个套接字绑定同一端口
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定到组播端口
sock.bind(('', MCAST_PORT))# 请求加入组播组
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)# 接收来自组播组的消息
while True:data, addr = sock.recvfrom(1024)print(f"Received message: {data.decode()} from {addr}")