C RTP数据包的套接字问题
我试图用C语言构建一个RTP数据包度量分析器,但我遇到了一个奇怪的问题,我正在减少实现细节以便于公开: 由于RTP数据包包含在UDP中,因此使用以下参数初始化我的套接字:C RTP数据包的套接字问题,c,sockets,rtp,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
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;
并与这些参数绑定:
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数据包不是第一次收到的,但再次发送它们就可以了
场景1:
我发送n个UDP数据包:它们被正确接收
场景2:
我发送n个RTP数据包:什么都没有发生
我再次发送相同的n个RTP数据包:它们被正确接收
无论数据包的n个数是多少。。。很奇怪,但却是真的
编辑:
在analyzer端,我运行了一个嗅探器,它显示了两个数据包突发,因此消息到达analyzer端,这不是与发送方相关的问题
问题:
RTP场景和UDP场景的代码完全相同(读取:相同的可执行文件)。
我做错了什么
旁注:
RTP管理库或高级RTP库的建议是否定的,我必须在这个抽象级别上工作,因为我需要分析度量标准
另外,网络度量分析器是一个否定的,我必须用我自己的代码来做这件事
提前感谢。我不认为您需要将mcast组地址重新命名为recvfrom地址,因为您已经加入了该组。从其他地方接收数据包真的令人担忧吗?我只会使用recv()。这个问题是由于我正在使用的板造成的,它被设置(不是我的代码)用于将RTP数据包直接重定向到MPEG解码器。
事实证明,解码器中的数据包不会被转发到内核。仍然需要理解为什么双重发送有效。我一拿回评估板,就会尝试使用recv而不是recvfrom。我使用recvfrom是因为我所看到的每个涉及多播的示例都使用join+recvfrom。