当前位置:  技术问答>linux和unix

关于fifo的问题

    来源: 互联网  发布时间:2017-01-11

    本文导语:  于事,所以选择用fifo进行缓冲,这个时候视频流依然不完整,反而以前的低码率也没办法保证完整性。 现在有三个可能: 第一个:接受udp慢,导致丢包。 第二个:fifo异常 第三个:上层应用编写不正确。 针对第一...

于事,所以选择用fifo进行缓冲,这个时候视频流依然不完整,反而以前的低码率也没办法保证完整性。

现在有三个可能:
第一个:接受udp慢,导致丢包。
第二个:fifo异常
第三个:上层应用编写不正确。

针对第一个:
    我选择创建两个线程,一个不同的在socket上读并写道fifo里面。另外一个线程,从fifo里面读,写入文件。结果没出现任何异常。
针对第三个:
    我的做法是,上层应用不从fifo里面读数据,而是从给定的视频文件里面读取。显示正常,没有出现任何错误。


所以可以确定是 fifo 缓冲不当造成的问题了。请问如何解决?
对了我发送视频的码率是 (37 Mbps(4.5MBps左右) )

fifo会溢出不?

|
楼主选择用fifo的原因肯定是考虑了UDP报文形式和消息队列的msg是统一的,所以毫不犹豫的选择了fifo。

楼主的问题多么简单啊,一个进程里2个线程间传递数据包。

网络线程读了一个UDP包,加锁放入循环队列。
文件线程加锁检测循环队列,有就取走,没有就阻塞在条件变量上。

楼主又会问了,我是UDP报文啊,放到队列里咋办啊?

你可以把队列做成char* queue[N]; 保证queue[i]指向的内存足够容纳一个UDP包。
也可以把队列做成字节流的:char queue[N*MAX_SIZE_PER_UDP]; 放进去的时候在UDP包前面加上4字节的int size;就行了。 

如果你觉得不用fifo会面临一个严重的问题,那就是网络线程数据太多,循环队列满了怎么办啊??

那么必须拿出绝招了,用pipe交互数据+I/O复用:

网络线程的UDP包带上int size的头部一起写入pipe,如果pipe容量不足或者已经满了,我们根据返回值,将没有写入的部分存到应用层buffer里,注册I/O复用的write事件。 等I/O复用通知我们可写我们才写,当然此时网络SOCKET的检测也是交给这个I/O复用了。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • FIFO一段小程序,无法读出FIFO。
  • apue上讲的 FIFOs
  • 十万火急==关于fifo读文件???
  • fifo
  • FIFO属于什么原语?
  • 重分求解,UNIX下的消息队列非常失败,经常发生堵塞现象,现改用FIFO,但FIFO又得自己设计消息,请高手指点
  • 关于unix下的fifo的疑问
  • 请问,FIFO的读写是否有字节数限制,PIPE_BUF如何使用?
  • <strong>*******FIFO 逐行读取 坐等大牛*******</strong>
  • tcp与fifo
  • 请问:FIFO文件能用mmap来使用吗?
  • 多个进程同时向fifo写不同的数据会有什么下场???
  • 请教一下各位高手,为什么fifo管道在线程内总是write失败?
  • 在cygwin中,用mknod()和mkfifo()不能创建fifo,为什么?
  • 请教:linux下的有名管道 fifo深度多大?
  • 进程间通信解决方案 MySQL-fifo-Plugin
  • 我写了一个虚拟命名管道(FIFO)的字符设备,如何使用呢?
  • 有名管道fifo什么时候创建,产生文件的属性
  • 如何用命名管道(FIFO)实现非阻塞模式进程间通讯(IPC)?
  • LINUX 下播放 DVD 全攻略 (关键字 DVD-ROM LiViD fifo OMS)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3