UDP,发送数据的速度不均匀,峰值时丢包怎么办?
我在用UDP协议写一个视频会议程序,当客户端发送较大的包(10k以上,只是偶尔会有这样的大包,就是所谓的关键帧)时,我把它拆分成很多1k左右的小包,然后在一个循环里逐个发送这些小包。服务器收到每个小包后转发给其他用户。现在会出现丢包的情况,即使用127.0.0.1也会丢,就是说不是网络造成的,是程序处理方法有缺陷。我知道问题大概所在,是因为客户端瞬时发送的数据太大了,超过socket缓冲区的大小,某个socket(不知道是服务器还是接收的客户端,是发送时还是接收时)来不及处理,缓冲区满了。但不知道应该怎么解决。我想到了几个办法,但是都有缺陷,请高手指教。
方法1:客户端降低发送速度。比如在发送循环里加一个sleep(0),但是这样会降低效率。在循环里用GetTickCount()然后更精确地控制发送速度的话,效率降低的更多。而且我的数据发送和数据压缩是在一个线程里,担心很影响后续数据的压缩。
方法2:增大socket缓冲区。客户端好说,我把缓冲区设到几百k都没问题,可是服务器端怎么办,最多可能有几千用户在线,设成几十M上百M是不是不太好。
方法3:在服务器端为每个用户开不同的端口?因为UDP不需要建立连接,所以我只用了一个socket和所有的客户端通讯,感觉这样效率高些。