我正在尝试在 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)
出了点问题,虽然我可以接收发往多播组的标准 UDP 数据包224.1.0.1
,但第一次没有收到 RTP 数据包,但再次发送它们就可以了。
场景一:
我发送n 个UDP 数据包:它们被正确接收
场景二:
我发送n 个RTP 数据包:没有任何反应
我再次发送相同的n 个RTP 数据包:它们被正确接收
无论n个数据包的数量是多少……太奇怪了,但确实如此。
编辑: 在分析器端,我正在运行嗅探器,它显示两个数据包突发,因此消息到达分析器端,这不是与发送者相关的问题。
问题:
RTP 场景和 UDP 场景的代码完全相同(阅读:相同的可执行文件)。我究竟做错了什么?
旁注:
RTP 管理库或高级 RTP 库建议是不可以的,我必须在这个抽象级别工作,因为我需要分析指标。
网络指标分析器也是一个禁忌,我必须用我自己的代码来做这件事。
提前致谢。