live555 socket 操作的handlerset类

转载至: http://blog.chinaunix.net/uid-28748731-id-3540287.html


1.Handlerset类的作用

类HandlerSet:Handler集合.Handler是什么呢?它是一种专门用于执行socket操作的任务(函数),HandlerSet被TaskScheduler用来管理所有的socket任务(增删改查);可以对每一个sock描述符实现不同的操作,以实现多态;

在BasicTaskScheduler0任务管理类中,包含HandlerSet* fHandlers,以实现对套接字的任务管理;
例如:在RTSP服务器建立的时候,在RTSPServer的构造函数RTSPServer::RTSPServer中会调用env.taskScheduler().turnOnBackgroundReadHandling,然后会调用BasicTaskScheduler::setBackgroundHandlingsetBackgroundHandling();把新建立的套接字,与RTSPServer::incomingConnectionHandlerRTSP建立一个HandlerDescriptort,来实现在服务器的listen套接字上接受新建立的链接;

2.HandlerDescriptort链表节点

HandlerDescriptort类,提供了sock描述符上的操作,把一个套接字描述符与一个操作,和一个私有数据结合起来;这个类相当于Handlerset双向链表的子节点;
类的定义:

点击(此处)折叠或打开

  1. class HandlerDescriptor {
  2.   HandlerDescriptor(HandlerDescriptor* nextHandler);
  3.   virtual ~HandlerDescriptor();
  4. public:
  5.   int socketNum; //
  6.   int conditionSet;
  7.   TaskScheduler::BackgroundHandlerProc* handlerProc;
  8.   void* clientData;
  9. private:
  10.   // Descriptors are linked together in a doubly-linked list:
  11.   friend class HandlerSet;
  12.   friend class HandlerIterator;
  13.   HandlerDescriptor* fNextHandler;
  14.   HandlerDescriptor* fPrevHandler;
  15. };
其中 BackgroundHandlerProc 的定义如下:typedef void  BackgroundHandlerProc(void* clientData, int mask);
类的构造函数为:

nextHandler为新建结点的下一个结点的指针,一般的使用方法为:HandlerDescriptor(fHandlers.fNextHandler);fHandlers为双向链表的头指针,把新建里的节点插入到头部节点的后面;

  1. HandlerDescriptor::HandlerDescriptor(HandlerDescriptor* nextHandler):conditionSet(0), handlerProc(NULL)
  2.  {
  3.   // Link this descriptor into a doubly-linked list:
  4.   if (nextHandler == this) { // initialization仅仅用于创建一个新的双向链表,在HandlerSet的构造函数中
  5.     fNextHandler = fPrevHandler = this;
  6.   } else {
  7.     fNextHandler = nextHandler;
  8.     fPrevHandler = nextHandler->fPrevHandler;
  9.     nextHandler->fPrevHandler = this;
  10.     fPrevHandler->fNextHandler = this;
  11.   }
  12. }

3.Handlerset双向链表

   Handlerset主要实现了一个 HandlerDescriptort的双向链表,并实现了对链表的插入,查找,删除的操作;

点击(此处)折叠或打开

  1. class HandlerSet {
  2. public:
  3.   HandlerSet();
  4.   virtual ~HandlerSet();
  5.    /*  把一个新的sock插入双向链表中,在HandlerDescriptor对象中建立socket和handler之间的关系;*/
  6.   void assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData);
  7.   void clearHandler(int socketNum); //删除相应的节点
  8.   void moveHandler(int oldSocketNum, int newSocketNum);//改变套接字描述符为新的套接字描述符

  9. private:
  10.   HandlerDescriptor* lookupHandler(int socketNum);//根据套接字查找相应的处理函数,没有找到则返回NULL

  11. private:
  12.   friend class HandlerIterator; 
  13.   HandlerDescriptor fHandlers; // handler双向链表的头结点 
  14. };
HandlerSet中的插入操作:

点击(此处)折叠或打开

  1. void HandlerSet::assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData) {
  2.   // First, see if there's already a handler for this socket:
  3.   HandlerDescriptor* handler = lookupHandler(socketNum);
  4.   if (handler == NULL) { // No existing handler, so create a new descr:
  5.     handler = new HandlerDescriptor(fHandlers.fNextHandler);//头结点的下一个节点
  6.     handler->socketNum = socketNum;
  7.   }

  8.   handler->conditionSet = conditionSet;
  9.   handler->handlerProc = handlerProc;
  10.   handler->clientData = clientData;
  11. }

4.类HandlerIterator


类HandlerIterator主要实现在HandlerSet中的迭代容器,next函数返回set中的下一个HandlerDescriptor,并保存当前的查找位置;

  1. class HandlerIterator {
  2. public:
  3.   HandlerIterator(HandlerSet& handlerSet);
  4.   virtual ~HandlerIterator();

  5.   HandlerDescriptor* next(); // returns NULL if none
  6.   void reset();

  7. private:
  8.   HandlerSet& fOurSet;
  9.   HandlerDescriptor* fNextPtr;
  10. };


next 函数  用于返回迭代器中的下一个变量

点击(此处)折叠或打开

  1. HandlerDescriptor* HandlerIterator::next() {
  2.   HandlerDescriptor* result = fNextPtr;
  3.   if (result == &fOurSet.fHandlers) // #toc, .toc, .mw-warning { border: 1px solid rgb(170, 170, 170); background-color: rgb(249, 249, 249); padding: 5px; font-size: 95%; }#toc h2, .toc h2 { display: inline; border: medium none; padding: 0px; font-size: 100%; font-weight: bold; }#toc #toctitle, .toc #toctitle, #toc .toctitle, .toc .toctitle { text-align: center; }#toc ul, .toc ul { list-style-type: none; list-style-image: none; margin-left: 0px; padding-left: 0px; text-align: left; }#toc ul ul, .toc ul ul { margin: 0px 0px 0px 2em; }#toc .toctoggle, .toc .toctoggle { font-size: 94%; }body { font-family: '宋体'; font-size: 10pt; text-align: justify; }table { }td { border-collapse: collapse; text-align: left; vertical-align: top 第一个插入链表的元素,也是最后一个元素,指向头部结点;每插入一个元素都排在头结点的后面;
  4.   {  // no more
  5.       result = NULL;
  6.   }
  7.  else 
  8. {
  9.     fNextPtr = fNextPtr->fNextHandler;
  10. }
  11.   return result;
  12. }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值