我正在尝试在C中构建一个RTP数据包度量分析器,但我最终出现了一个奇怪的问题,我正在减少实现细节以便于曝光:
由于RTP数据包包含在UDP中,因此我的套接字使用以下参数进行初始化:
sock_domain = AF_INET;
sock_type = SOCK_DGRAM;
sock_proto = IPPROTO_UDP;
并与这些参数绑定:
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = 10000; // My server is streaming on 10000
socket_addr.sin_addr.s_addr = INADDR_ANY;
并加入了多播组:
mgroup_req.imr_multiaddr.s_addr = inet_addr("224.1.0.1"); // Multicast group of the stream
mgroup_req.imr_interface.s_addr = INADDR_ANY;
将我收到的组播组设置为:
mgroup_addr.sin_family = socket_addr.sin_family;
mgroup_addr.sin_port = socket_addr.sin_port;
mgroup_addr.sin_addr.s_addr = mgroup_req.imr_multiaddr.s_addr;
接收带有recvfrom功能的数据包:
errcode = recvfrom(sockfd, &recvbuff, IPMAXSIZE, 0, (struct sockaddr *)&mgroup_addr, &mgroup_addr_len)
出现问题,虽然我可以收到发往多播组224.1.0.1
的标准UDP数据包,但第一次没有收到RTP数据包,但再次发送它们就可以了。
情景1:
我发送 n UDP数据包:它们被正确接收
情景2:
我发送 n RTP数据包:没有任何反应
我再次发送相同的 n RTP数据包:它们被正确接收
无论 n 数据包是多少......如此奇怪但真实。
编辑: 在分析仪方面,我正在运行一个嗅探器,它会显示数据包突发,因此消息到达分析器端,这不是发送者相关的问题。
问题:
RTP场景和UDP场景的代码完全相同(读取:相同的可执行文件)。 我做错了什么?
旁注:
RTP管理库或高级RTP库建议是禁忌,因为我需要分析的指标,我必须在这个抽象级别工作。
网络指标分析器也是禁忌,我必须使用我自己的代码。
提前致谢。
答案 0 :(得分:0)
我不相信您需要再次将mcast组地址命名为recvfrom地址,因为您已加入该组。收到来自其他地方的数据包真正受到关注我只想使用recv()。
答案 1 :(得分:0)
问题是由于我正在处理的电路板,设置(不是我的代码)将RTP数据包直接重定向到MPEG解码器。 结果是解码器中的数据包不会被转发到内核。仍然要理解为什么双重发送工作。