要想让task与socket关联起来,从而让socket以task的方式工作。
class HTTPSession : public HTTPSessionInterface;
class RTSPSession : public RTSPSessionInterface;
无论是HTTPSessionInterface还是RTSPSessionInterface,都派生于task,而内部均有TCPSocket fSocket成员,将fSocket与之际的socket关联即可。
因为TCPSocket内的ProcessEvent都是基类EventContext的方法,所以当收到客户端请求后,都是调用其关联的task的sinal方法,
class RTSPListenerSocket : public TCPListenerSocket
class HTTPListenerSocket : public TCPListenerSocket
class TCPListenerSocket : public TCPSocket, public IdleTask。
RTSPListenerSocket和HTTPListenerSocket均是派生于TCPListenerSocket。而它又是如何让task与socket关联起来的呢?
同时继承了TCPSocket和IdleTask,并且将TCPSocket内部的task直接设置成NULL。因TCPListenerSocket改写了虚函数:ProcessEvent,
因此当有客户端连接上时,直接触发Run函数,其内调用TCPListenerSocket::ProcessEvent,其内部调用GetSessionTask产生新的TCPSocket并将其内部的task与
class HTTPSession : public HTTPSessionInterface;
class RTSPSession : public RTSPSessionInterface;
无论是HTTPSessionInterface还是RTSPSessionInterface,都派生于task,而内部均有TCPSocket fSocket成员,将fSocket与之际的socket关联即可。
因为TCPSocket内的ProcessEvent都是基类EventContext的方法,所以当收到客户端请求后,都是调用其关联的task的sinal方法,
因此HTTPSession和RTSPSession在其Run函数中就能够获取到socket消息。
class RTSPListenerSocket : public TCPListenerSocket
class HTTPListenerSocket : public TCPListenerSocket
class TCPListenerSocket : public TCPSocket, public IdleTask。
RTSPListenerSocket和HTTPListenerSocket均是派生于TCPListenerSocket。而它又是如何让task与socket关联起来的呢?
同时继承了TCPSocket和IdleTask,并且将TCPSocket内部的task直接设置成NULL。因TCPListenerSocket改写了虚函数:ProcessEvent,
因此当有客户端连接上时,直接触发Run函数,其内调用TCPListenerSocket::ProcessEvent,其内部调用GetSessionTask产生新的TCPSocket并将其内部的task与
accpet后的socket关联上。最后在调用theSocket->RequestEvent(EV_RE),等待该socket事件发生。
总结:
socket事件分成两类,分别是建立RTSP连接请求的到达和RTSP请求的到达。
对于RTSP连接请求的事件,EventThread建立一个RTSPSession,并启动针对相应的socket的侦听。
对于RTSP请求的事件,EventThread把对应的RTSPSession类型的Task加入到TaskThread的队列中,等待RTSP请求被处理