Darwin RTSP点播流程代码分析1

来源:互联网 发布:药智网药品标准数据库 编辑:程序博客网 时间:2024/05/16 15:30

1.      初始化

在dss中runserver.cpp的startserver是整个服务的初始化函数

关于RTSP点播这块的主要初始化内容如下:

1)  sServer->Initialize(inPrefsSource,inMessagesSource, inPortOverride,createListeners);

//RunServer.cpp

sServer的类型是QTSServer,在初始化函数中调用了CreateListeners函数,目的是创建两个监听对象

l  RTSPListenerSocket

l  HTTPListenerSocket

这两个类都继承于TCPListenerSocket类

 

2)  Socket::StartThread();//启动EventThread线程

3)在其他初始化工作完成后,在runserver.cpp中的startserver开始启动任务  sServer->StartTasks();

主要的工作是注册请求事件:fListeners[x]->RequestEvent(EV_RE);

其实就是把sUniqueID与自己类的指针this管理,然后注册到EventThread线程中fRefTable引用表中,然后把文件描述符(socket)加入到select函数监视的集合中

PS:这块设计到dss的网络架构模型,后续会出专门一篇文章进行描述,目前大家知道这个目的就可以了

 

 

2.      点播请求

当客户端发出请求时,EventContext.cpp中void EventThread::Entry()函数中select_waitevent函数会检测到有对象可读,然后然后从fRefTable中解析出来关联的对象类,执行对应的ProcessEvent

说明:大家都知道dss的网络模型是select,select_waitevent是检测是否有可读的对象

fRefTable这个是OSRefTable引用表的类,关于这块代码请参考我另一篇blog

http://blog.csdn.net/wq5866280/article/details/50435974

这里fRefTable中解析出来的对象,其实就是1.3节中说明fListeners[x],这里请求的是RTSP,所以对象是RTSPListenerSocket,这里主要是处理RTSPListenerSocket的ProcessEvent

 

3.      RTSPListenerSocket的ProcessEvent

由于RTSPListenerSocket是TCPListenerSocket的派生类,ProcessEvent的执行是在TCPListenerSocket类中

函数的主要作用:accept客户端

每接收一个客户端,就是创建一个TCPSocket* theSocket = NULL;

theTask = this->GetSessionTask(&theSocket);

//创建一个 RTSPSession* theTask = NEW RTSPSession

然后设置客户端theSocket与task关联,然后注册事件

theSocket->Set(osSocket,&addr);

theSocket->InitNonBlocking(osSocket);

theSocket->SetTask(theTask);

theSocket->RequestEvent(EV_RE);

和1.3节一样

把客户端的socket加入到select监视集合中,如果有数据需要读取,这执行TCPSocket的ProcessEvent函数,其实就是基类EventContext中的ProcessEvent,也就是给把task加入到线程池中某一个线程的 OSQueue_Blocking   fTaskQueue队列中,等待执行task类中的run函数,这里运行的就是RTSPSession中的run函数。

 

后面一个章节主要说明RTSPSession的run函数。

以上内容是个人研究,如有错处,欢迎加本人的QQ 272706196一起讨论学习,或者加入我们的EasyDarwin的群288214068496258327

0 0
原创粉丝点击