- 1 套接字创建,绑定,监听
- 主函数main()启动以后,会调用
- (DynamicRTSPServer::createNew—> RTSPServer::setUpOurSocket setupStreamSocket)
- 在setupStreamSocket中实现TCP中S端套接字的创建,绑定,监听,设置非阻塞模式操作,其监听端口是854.
- 在套接字相关操作执行完成以后会执行 new DynamicRTSPServer(派生自RTSPServer),因此也会调用RTSPServer::RTSPServer并在其中中执行env.taskScheduler().turnOnBackgroundReadHandling(fServerSocket,
- (TaskScheduler::BackgroundHandlerProc*)&incomingConnectionHandler, this)
- 注:其中这个env就是在main()函数中调用BasicUsageEnvironment::createNew生成的。
- 第一个函数参数fServerSocket是服务器监听套接字。
- 第二个参数是函数RTSPServer::incomingConnectionHandler地址指针。
- 在BasicTaskScheduler::turnOnBackgroundReadHandling中会将fServerSocket存储到
- HandlerSet* (HandlerSet* BasicTaskScheduler::fReadHandlers)结构中。
- 同时将监听套接字 放到fReadSet中,在下面的select机制中用的到。
- 将第二个参数
- 对应handler->handlerProc。
- 2 准备接受连接
- 执行代码:env->taskScheduler().doEventLoop();
- 这个env和 1中env是同一个。
- 调用:BasicTaskScheduler0::doEventLoop—> BasicTaskScheduler0::doEventLoop
- 在doEventLoop无限循环执行select等待客户端连接。
- 执行代码:int selectResult = select(fMaxNumSockets, &readSet, NULL, NULL,
- &tv_timeToDelay)
- 其中监听套接字已经放到readset中。
- 如果检测到客户端连接执行:
- (*handler->handlerProc)(handler->clientData, SOCKET_READABLE);
- 即RTSPServer:: incomingConnectionHandler。
- 在此函数中 accept()客户端连接,创建RTSPClientSession*
- 注:在RTSPClientSession其实封装了RTSP功能。
- 3 接收客户端连接完成 进行RTSP交互
- 通过在RTSPClientSession::RTSPClientSession执行
- envir().taskScheduler().turnOnBackgroundReadHandling(fClientSocket,
- (TaskScheduler::BackgroundHandlerProc*)&incomingRequestHandler, this)
- 参数1:accept()生成的客户端套接字
- 参数2:客户端信息接收处理函数地址指针
- 其后在singlestep函数中除了监听新客户端连接外还要等待接收已经连接客户端发送过来的信息。还是通过
- (*handler->handlerProc)(handler->clientData, SOCKET_READABLE);
- 调用incomingRequestHandler来完成。
live555 接收客户端连接及rtsp交互---网络连接处理及RTSP连接模块 .
最新推荐文章于 2022-05-20 16:40:55 发布