GNUGK源码分析

类别:软件工程 点击:0 评论:0 推荐:
  GNUGK是建立在Openh323和PWlib基础上的开源项目,支持OpenSSL,MySQL,OpenLDAP和FreeRADIUS,并且可以穿越防火墙和NAT.实际上GateKeeper已经成为H.323网络的核心部分,整个网络都由它掌控,而GNUGK几乎又是GateKeeper的业界标准,所以研究Openh323的同时了解GNUGK的原理和实现也是很有必要的。
    GNUGK是由Jan Willamowius说领导开发,不同于Openh323的开发小组,它采用标准的c++编写,可实现跨平台编译,不过和Openh323不同的是GNUGK大量采用了C++的STL技术,比如模板和向量等等...,所以建议在看GNUGK前好好学习PWlib,Openh323和STL,这样才能为以后的学习打下坚实的基础。
废话不多讲,我们上路吧。
    此处我用的是从CVS上Update的最新的GNUGK和Pandora的PWlib和Openh323.和每个基于PWlib的程序一样,首先从PProcess派生出一个GateKeeper类,程序就从GateKeeper::Main()开始。
void Gatekeeper::Main()
{
 PArgList & args = GetArguments();           //获得命令行参数
 args.Parse(GetArgumentsParseString());     //解析各个参数

#ifdef HAS_SETUSERNAME                         //设置以特殊用户身份运行
 if (args.HasOption('u')) {                               //默认值是关闭的
  const PString username = args.GetOptionString('u');

  if ( !SetUserAndGroup(username) ) {
   cout << "GNU Gatekeeper could not run as user "
        << username
        << endl;
   return;
  }
 }
#endif

 if(!InitLogging(args) || !InitToolkit(args))      //InitLogging对日志和跟踪(Trace)进行初始化
  return;                                                    //InitToolkit

 if (args.HasOption('h')) {                        //如果包含命令行参数'h'
  PrintOpts();                                          //显示帮助信息
  ExitGK();                                             //停止Log和Trace,删除Toolkit并退出
 }

 if (!InitConfig(args) || !InitHandlers(args))//InitConfig读取INI配置文件
  ExitGK();                                              //InitHandlers设置Ctrl+C停止热键

 EnableLogFileRotation();                       //开始记录日志
 
 PString welcome("OpenH323 Gatekeeper - The GNU Gatekeeper with ID '" + Toolkit::GKName() + "' started\n" + Toolkit::GKVersion());
 cout << welcome << '\n';
 PTRACE(1, welcome);

 if (args.HasOption('i'))                          //使用自定义的IP地址
  Toolkit::Instance()->SetGKHome(args.GetOptionString('i').Lines());

 std::vector

本文地址:http://com.8s8s.com/it/it34623.htm