现做一个视频数据中转服务器程序,服务器的任务是转发视频发布者的视频数据给其他用户还有保存该视频数据为文件,请问应该如何保存用户的视频数据?现在一个解决办法是每个UserInfo里面有一个lsVideoData链表来保存用户的视频数据,UDP监听线程接收到数据就New一个视频数据结构体来保存然后添加到链表里面,但是由于需要多线程添加删除链表中的元素需要加Critical_Section来保护,但是每个用户加一个Section这样感觉发布用户数量多的情况下效能差, 请教一般的媒体服务器对于数据处理一般是怎么做的,求一个高效的解决方案。

解决方案 »

  1.   

    楼主参考这个商业的音视频开发包:http://www.anychat.cn/
      

  2.   

    UDP传输竟然叫我用完成端口……
      

  3.   

    UDP当然可以使用完成端口了的。
      

  4.   

    网络模型最好选择IOCP,网上有开源的例子,可以参考一下。延时为什么会越来越大?是客户端问题还是中转性能问题?需要定位出来。帧结构当然需要你自己定义,怎么能在客户端获取足够的信息,然后解码显示,这就可以了。
      

  5.   

    最重要的是线程和内存的管理。线程数量太多,线程切换非常频繁,会影响系统性能,可伸缩性差。选择IOCP,一方面避免开过多线程,另外也能够提高网络性能。内存最好考虑内存池机制,否则频繁的申请、释放,系统性能也会打折扣。另外如果有大量的小片内存分配,并且这些内存生存周期管理不好,很容易内存碎片。
      

  6.   

    从服务器设计的角度来说,在UDP中频繁使用NEW会导致内存碎片。应该为每一个客户事先分配一个固定大小的缓冲区,当写入缓冲区的数据到达一定程度后,执行一个线程写磁盘操作。当客户失去连接后,回收缓冲区。这样分配的空间是固定的,一般不会出现内存碎片的问题。
    UDP是可能丢包的。如果丢包是偶发的,那么是网络问题。如果是经常性的,就必须检查网络数据处理部分。
    至于选择什么样的socket模型,根据应用场合,一般情况下,非阻塞的模型都能满足需求。