UDP,发送数据的速度不均匀,峰值时丢包怎么办?

halleyzhang3 2010-04-29 03:18:10
我在用UDP协议写一个视频会议程序,当客户端发送较大的包(10k以上,只是偶尔会有这样的大包,就是所谓的关键帧)时,我把它拆分成很多1k左右的小包,然后在一个循环里逐个发送这些小包。服务器收到每个小包后转发给其他用户。现在会出现丢包的情况,即使用127.0.0.1也会丢,就是说不是网络造成的,是程序处理方法有缺陷。我知道问题大概所在,是因为客户端瞬时发送的数据太大了,超过socket缓冲区的大小,某个socket(不知道是服务器还是接收的客户端,是发送时还是接收时)来不及处理,缓冲区满了。但不知道应该怎么解决。我想到了几个办法,但是都有缺陷,请高手指教。

方法1:客户端降低发送速度。比如在发送循环里加一个sleep(0),但是这样会降低效率。在循环里用GetTickCount()然后更精确地控制发送速度的话,效率降低的更多。而且我的数据发送和数据压缩是在一个线程里,担心很影响后续数据的压缩。

方法2:增大socket缓冲区。客户端好说,我把缓冲区设到几百k都没问题,可是服务器端怎么办,最多可能有几千用户在线,设成几十M上百M是不是不太好。

方法3:在服务器端为每个用户开不同的端口?因为UDP不需要建立连接,所以我只用了一个socket和所有的客户端通讯,感觉这样效率高些。
...全文
781 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
halleyzhang3 2010-05-04
  • 打赏
  • 举报
回复
谢谢大家帮助,看来还是得限速。可以结帖了
sanguomi 2010-05-04
  • 打赏
  • 举报
回复
UDP 发得快的话,丢包很正常的,
Sleep一下, 网络差的情况,丢包还是会有的
简单点的话 可以自己做个验证过程,
halleyzhang3 2010-04-30
  • 打赏
  • 举报
回复
rtp没有对拥塞控制做具体的建议,由应用程序自己根据情况去实现。他只是给出了RTCP作为拥塞状况的一个反馈
newasoft 2010-04-29
  • 打赏
  • 举报
回复
熟悉rtp包的收发策略,借鉴一下。
buptzwp 2010-04-29
  • 打赏
  • 举报
回复
mark
尹成 2010-04-29
  • 打赏
  • 举报
回复
代码的问题,需要检查每次调用 socket函数的返回值并作不同处理
halleyzhang3 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kydef 的回复:]
楼主,开双缓冲区试试,可以明显改善你目前的状况...
[/Quote]
你的意思是不是说,生产者(数据压缩)用一个线程,把产生的数据放在一个缓冲区,消费者(发送)用另一个线程,在这个线程里匀速地从缓冲区取
我还是嫌麻烦,这个要写好多代码,还要加锁。不过好像除此之外,没什么好办法了。
bragi523 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 halleyzhang3 的回复:]
感谢大家的帮助,需要说明的是,我做的是实时传输,不能进行丢包的检测和重发,所以丢包是必然的,丢了就丢了。我现在的问题是在本机上也丢包,我觉得这是程序问题,而且我增大缓冲区后的确是不丢了(本机)。我想知道这样是不是好的解决办法,有没有更好的办法。
[/Quote]
不好,没有根本解决问题,你最好还是做一下限速,任何软件都最好不要占满你的网络,适当的sleep是必须的,你可以计算一下,控制一个峰值
halleyzhang3 2010-04-29
  • 打赏
  • 举报
回复
感谢大家的帮助,需要说明的是,我做的是实时传输,不能进行丢包的检测和重发,所以丢包是必然的,丢了就丢了。我现在的问题是在本机上也丢包,我觉得这是程序问题,而且我增大缓冲区后的确是不丢了(本机)。我想知道这样是不是好的解决办法,有没有更好的办法。
Un1 2010-04-29
  • 打赏
  • 举报
回复
从现象来看并不是socket缓冲的问题,还是代码的问题,需要检查每次调用 socket函数的返回值并作不同处理。
UDX协议 2010-04-29
  • 打赏
  • 举报
回复
自己实现可靠传输有点麻烦。
http://topic.csdn.net/u/20091130/12/0ea2c403-b7bd-4b27-bc17-6e5b5cd4cd55.html
kydef 2010-04-29
  • 打赏
  • 举报
回复
楼主,开双缓冲区试试,可以明显改善你目前的状况...
m_tornado 2010-04-29
  • 打赏
  • 举报
回复
无连接的弊端~
shenyi0106 2010-04-29
  • 打赏
  • 举报
回复
发送几个包,停一下
bragi523 2010-04-29
  • 打赏
  • 举报
回复
发太快了
但是UDP如果不做保护,不丢包是无法保证的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧