Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C RTP数据包的套接字问题_C_Sockets_Rtp - Fatal编程技术网

C RTP数据包的套接字问题

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

我试图用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;
并与这些参数绑定:

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。