背景
- 一条普通的udp组播地址一般包含俩条地址信息: 组播地址 udp://@ip:port和源地址source ip(来源设备的网卡地址)
- 有时需要指定source ip用于定位组播流和区分其它组播流。
功能
- 通过组播地址 udp://@ip:port和本机拉流网卡地址localaddr找到source ip
示意图
程序
# multicast_server.py
import socket
MCAST_GRP = '237.1.1.1'
MCAST_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
sock.bind((MCAST_GRP, MCAST_PORT))
host = "10.1.129.125"
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(host))
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(MCAST_GRP) + socket.inet_aton(host))
data, addr = sock.recvfrom(1024)
print(addr)
sock.close()
执行
(base) [root@localhost ~]# cd /opt/test/
(base) [root@localhost test]# vim multicast_server.py
(base) [root@localhost test]# python multicast_server.py
('10.2.1.80', 2560)
当然了,也可以这么搞,手动输入地址
程序2
import socket
MCAST_GRP = input('请输入信源组播地址:')
MCAST_PORT = input('请输入端口:')
MCAST_PORT = int(MCAST_PORT)
try:
socket.inet_aton(MCAST_GRP)
except socket.error:
print("无效的组播地址格式。请使用正确的IPv4地址格式。")
exit()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
sock.bind((MCAST_GRP, MCAST_PORT))
host = input('请输入拉流网卡地址:')
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(host))
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(MCAST_GRP) + socket.inet_aton(host))
data, addr = sock.recvfrom(1024)
print('source_ip=%s' % addr[0])
sock.close()
执行2
(base) [root@localhost test]# vim multicast_server.py
(base) [root@localhost test]# python multicast_server.py
请输入信源组播地址:239.1.1.102
请输入端口:1024
请输入拉流网卡地址:10.1.129.125
source_ip=10.2.1.176