darwin之socket与Task关联

来源:互联网 发布:鹏博士云计算业务中心 编辑:程序博客网 时间:2024/06/07 22:27
要想让task与socket关联起来,从而让socket以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请求被处理








原创粉丝点击