ฉันกำลังพยายามเข้าร่วมสตรีมมัลติคาสต์ IGMP จากเครื่อง Centos 8 แต่หลังจากส่ง JOIN แล้ว ไม่มีการรับส่งข้อมูลที่มาจากสวิตช์
การเชื่อมต่อที่เรียบง่าย:
MUX <-----------> cisco3850 <--------> เซ็นโตส8
192.168.117.13 192.168.117.21
สวิตช์อัปสตรีม (cisco catalyst 3850) ป้อน MPEG-TS เป็น 239.1.1.1:4000 จาก MUX
ฉันได้ลองทั้งสองอย่างแล้ว โซแคท
และโปรแกรมของฉันเองในการเปิดซ็อกเก็ต เข้าร่วมสตรีม และเปิดซ็อกเก็ตค้างไว้ ทั้งคู่ส่งข้อความเข้าร่วม IGMP เดียวกันกับที่ยืนยันโดย wireshark:
โปรโตคอลการจัดการกลุ่มอินเทอร์เน็ต
[เวอร์ชัน IGMP: 3]
ประเภท: รายงานการเป็นสมาชิก (0x22)
จอง: 00
เช็คซัม: 0xe9fb [ถูกต้อง]
[สถานะเช็คซัม: ดี]
จอง: 0000
Num บันทึกกลุ่ม: 1
บันทึกกลุ่ม: 239.1.1.1 เปลี่ยนเป็นโหมดไม่รวม
ประเภทเรคคอร์ด: เปลี่ยนเป็นโหมดไม่รวม (4)
Aux ข้อมูลเลน: 0
จำนวน Src: 0
ที่อยู่แบบหลายผู้รับ: 239.1.1.1
โดยใช้ เพิ่มเส้นทาง ip
ฉันสร้างเส้นทางสำหรับกลุ่มมัลติคาสต์ไปยังอินเทอร์เฟซ:
ลิงก์ขอบเขต 224.0.0.0/4 dev eth1
ลิงก์ขอบเขต 225.0.0.0/8 dev eth1
239.0.0.0/8 dev ลิงค์ขอบเขต eth1
และ แมว /proc/net/igmp
แสดงว่าเข้าร่วมกลุ่มแล้ว:
แมว /proc/net/igmp
Idx Device : นับจำนวนผู้ใช้ Querier Group Timer Reporter
3 eth1 : 2 V3
030101E1 1 0:00000000 0
010000E0 1 0:00000000 0
ฉัน สงสัย นี่เป็นปัญหาเกี่ยวกับสวิตช์มากกว่าปัญหาของ Linux แต่ลูกค้า (ซึ่งเป็นเจ้าของสวิตช์) บอกว่าทุกอย่างเรียบร้อยดี
ฉันสามารถทำอะไรได้อีกในฝั่ง Linux เพื่อตรวจสอบ/แก้ไขปัญหานี้
หากเป็นปัญหาที่สวิตช์แล้วล่ะก็ ต้องกำหนดค่าอะไรที่นั่น (จำเป็นต้องอธิบายให้ลูกค้าทราบ)
สำหรับการอ้างอิงโปรแกรมของฉันที่เข้าร่วมและเปิดซ็อกเก็ตไว้มีลักษณะดังนี้:
// การตรวจสอบข้อผิดพลาดถูกละไว้สำหรับความกะทัดรัด
fd = ซ็อกเก็ต (PF_INET, SOCK_DGRAM, IPPROTO_IP);
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port = htons (พอร์ต);
ผูก(fd, (struct sockaddr *)&saddr, sizeof(saddr);
โครงสร้าง ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = interfaceAddr;
setsockopt(ถุงเท้า, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);