这是[手把手一起学live555]的第7篇(按这个序号看,请找正确顺序看)。
live555工程在我的gitee下(doc下有思维导图、drawio图):https://gitee.com/lure_ai/live555/tree/master
学习demo
live555mediaserver.cpp
学习线索和姿势
1.学习的线索和姿势
网络编程
流媒体的发动机 是网络编程(socket编程)。[网络编程学习]-0.学习路线。
绘图规则
本文的对象图和思维导图遵守的规则详见:
2.绘图规则
本节内容和目标
(1)TCP非阻塞服务端网络编程流程accept节点(非阻塞服务网络编程流程:socket创建、bind、listen、select、accept、select、recv/send)
(2)思维导图绘制
(3)对象图绘制
正式开始
5.live555mediaserver-accept已经追踪到了accept流程,本节追踪select、recv/send流程。
还记得上一节讲的目前链表中有3个了——一个是链表头结点(哨兵-不保存任何数据),一个是服务端监听socket,一个是客户端已链接socket。上一节的链表图搬来如下:
因此BasicTaskScheduler0::doEventLoop是个while循环,它循环调用BasicTaskScheduler::SingleStep,select就在这里面,这次就同时监听服务端监听socket、客户端已链接socket了。咱们从这起手!
我依然以之前VLC拉流为例,接下来VLC会下发rtsp协议,完成后还会发送rtp包数据。——这些VLC客户端发送的数据都发送到服务端的已连接客户端socket了,服务端自然select到了,最后匹配到该socket的链表队员,执行对应方法。思维导图如下:
如上图所示,客户端与服务端之间传输的就是rtsp协议、rtp包等了——这些我们先不谈,它们整体传输流程就是重复的select已链接客户端socket然后执行如下方法:
GenericMediaServer::ClientConnection::incomingRequestHandler(void* instance, int /mask/)
这个方法里是处理这些rtsp协议、rtp数据的地方,我现在只关注网络编程线索,它是通过recvfrom取出客户端发送过来的数据的,并通过send传回数据给客户端的。
那么整个传输过程就是重复的select-recv/send。
那么到此,网络编程线索告一段落。——第1阶段、第1条线索暂时讲解到这里,接下来就要进入第2阶段第2条线索——rtsp协议线索——了,在这之前有必要总结下,所以下一节是总结。