【发布时间】:2015-10-12 18:27:13
【问题描述】:
我有一个客户端和一个服务器,服务器通过封装在 UDP 中的 RTP 数据包发送音频数据。客户端接收数据包。由于 UDP 没有流量控制,客户端会检查数据包的序列号,如果出现乱序则重新排列它们。 我的问题是,我看到客户端永远不会收到带有某些序列号的数据包,如下面的 wireshark -
如果是这种情况,当我在客户端播放音频时,它会失真(很明显)。我该如何避免?哪些因素会影响这些?我应该将套接字缓冲区大小设置为较大的值吗?
提前感谢回复。
编辑 1:这个问题是在 QNX 平台上而不是在 Linux 上。
我观察了“netstat -p udp”的输出,看看它是否给出了关于为什么包在 QNX 而不是在 Linux 上被丢弃的任何提示。
QNX:
SOCK=/dev/d_usb3/ netstat -p udp
udp:
8673 datagrams received
0 with incomplete header
60 with bad data length field
0 with bad checksum
0 dropped due to no socket
2 broadcast/multicast datagrams dropped due to no socket
0 dropped due to full socket buffers
8611 delivered
8592 PCB hash misses
在 Linux 上,我看到 netstat 显示相同服务器和相同音频没有丢包!
有什么线索吗?为什么会这样?驱动问题?网络堆栈?
【问题讨论】:
-
这取决于您的架构/驱动程序。 RTP 没有定义任何特定的机制来恢复丢失的数据包。该机制取决于基于 RTP 标头中可用信息的体系结构。您能否分享有关您的设计的更多信息。
标签: c sockets udp audio-streaming rtp