【发布时间】:2018-06-08 17:32:35
【问题描述】:
我开发了一个 MPEG-ts Streamer。它从文件中读取数据包并以正确的速度将它们发送给接收者。
现在一切正常,除了我经常有一些滞后。我已经在我的代码中搜索了所有可能的错误。我已经在性能方面优化了我的程序。
现在我记录了sendto() 函数发送数据包所花费的时间,我还记录了数据包应该发送的时间和发送时间之间的差异。
我注意到每次数据包都比平均时间晚很多,sendto() 发送前一个数据包的时间也比正常时间长得多。
这表明我是 sendto() 每次发送数据包需要更长的时间时都会导致这些滞后。我正在使用 UDP 套接字。
我可能对套接字做错了吗?套接字缓冲区是否已满并且发送数据包实际上需要更长的时间?还是我错过了什么?有没有办法加速套接字或使它在发送之前不完全填满它的缓冲区?
由于这是为了流式传输视频,我在很大程度上取决于性能,主要用于 HD,因为数据包的数量更多,所以延迟发生的频率更高。
【问题讨论】:
-
您是从网络对等方获得响应,还是您只是发送而对等方只是接收?
-
发送缓冲区很可能已满,您应该测量一下您使用了多少带宽,以及您有多少可用带宽。如果您发布了一些您发现的时间,以及更多关于您发送的数据量和速率、数据包大小等的信息,这可能会有所帮助。也可以使用wireshark 查看内容——您要确保自己没有坚持例如arp 超时或触发大量 ICMP 回复。 (请注意,当接收缓冲区已满时,您很容易丢失 UDP 数据包,但如果发送缓冲区已满,您的程序会阻塞。)
标签: c linux network-programming