0

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

网络指标分析器也是一个禁忌,我必须用我自己的代码来做这件事。

提前致谢。

4

2 回答 2

0

我不相信您需要再次将 mcast 组地址命名为 recvfrom 地址,因为您已经加入了该组。从其他地方接收数据包是一个真正的问题吗?我只会使用recv()。

于 2010-11-26T04:00:53.000 回答
0

问题是由于我正在研究的电路板,它被设置(不是我的代码)用于将 RTP 数据包直接重定向到 MPEG 解码器。事实证明,解码器中的数据包不会被转发到内核。仍然必须了解为什么双重发送有效。

于 2010-12-29T13:56:46.513 回答