RTP数据包的套接字问题

时间:2010-11-25 09:56:05

标签: c sockets rtp

我正在尝试在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库建议是禁忌,因为我需要分析的指标,我必须在这个抽象级别工作。

网络指标分析器也是禁忌,我必须使用我自己的代码。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我不相信您需要再次将mcast组地址命名为recvfrom地址,因为您已加入该组。收到来自其他地方的数据包真正受到关注我只想使用recv()。

答案 1 :(得分:0)

问题是由于我正在处理的电路板,设置(不是我的代码)将RTP数据包直接重定向到MPEG解码器。 结果是解码器中的数据包不会被转发到内核。仍然要理解为什么双重发送工作。

相关问题