流媒体转发服务器视频监控流媒体服务器的作用


前段时间在公司开发了基于udp的流媒体转发服务器,在公网udp转发ts,花屏比较严重。课下之余写了epoll-tcp模型的转发服务器作为测试,比较一下效果,其间遇到不少问题,在此做个笔记。代码最后附上

time_ttm;//上次活动时间intbufsize;//用于epoll接收intwantsize;intrecvsize;char*recvbuf;CBufQuebufque;//循环队列,客户端用于缓存要发送的数据

typedefmapMAPConnection;//socket-Connection//存储会话

typedefmapMAPTermClient;//一个终端可以转发到多个客户端,保存客户端的key

线程3-client:接收客户端的请求,分发视频数据,epollLT模式非阻塞socket

ET模式下ept存在的问题考虑这种情况:多个连接同时到达,服务器的TCP就绪队列瞬间积累多个就绪连接,由于是边缘触发模式,epoll只会通知一次,ept只处理一个连接,导致TCP就绪队列中剩下的连接都得不到处理。

解决办法是用while循环抱住ept调用,处理完TCP就绪队列中的所有连接后再退出循环。如何知道是否处理完就绪队列中的所有连接呢?ept返回-1并且errno设置为EAGAIN就表示所有连接都处理完。

EpollET模式非阻塞socket,必须独到没有数据可读,此处的设计是每个socket对应一个connection,connection中有一个数据包的长度wantsize,接收完一个数据包之后,会将此数据包放入队列等待处理,循环接收下一个数据包

EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:

1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。

2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的!

其实,如果你真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT),关键是重新设置,就会马上触发一次EPOLLOUT事件。

EPOLLIN事件:EPOLLIN事件则只有当对端有数据写入时才会触发,所以触发一次后需要不断读取所有数据直到读完EAGAIN为止。否则剩下的数据只有在下次对端有写入时才能一起取出来了。现在明白为什么说epoll必须要求异步socket了吧?如果同步socket,而且要求读完所有数据,那么最终就会在堵死在阻塞里。

wh_shentu929:博主,您好,请问您这边的流程图绘制的软件用的是哪个?还挺不错的



1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。