Skip to content

Multicast in Practice: Group Control and Common Pitfalls

Practical multicast setup, group membership control, and debugging lessons.

This English edition retains the original diagrams and examples for direct use.

Reference diagram 1

Reference diagram 2

Reference diagram 3

Reference diagram 4

Commands and examples

# 过滤 IGMP 报文
tcpdump -i eth0 igmp -nn
# 临时关掉反向路径过滤,看看通不通
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
import socket
import struct

MCAST_GRP = '224.1.1.1'
MCAST_PORT = 65000

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)

print(f"Waiting for {MCAST_GRP}:{MCAST_PORT}...")
while True:
    data, addr = sock.recvfrom(1024)
    print(f"Recv from {addr}, data: {data.decode()}")
python3 multicast.py
// 强制从 192.168.1.100 这个接口发送组播
  struct in_addr localInterface;
  localInterface.s_addr = inet_addr("192.168.1.100");
  setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface));
struct ip_mreq mreq;
  mreq.imr_multiaddr.s_addr = inet_addr("224.1.1.1");
  // 明确指定从 eth0 的 IP (192.168.1.100) 上加组
  mreq.imr_interface.s_addr = inet_addr("192.168.1.100"); 
  setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
int ttl = 1400;
setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
# 简单粗暴,先清空规则试试
iptables -F

Practical notes

Adapt the commands and configuration to the version, distribution, and target hardware being used.