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/it27255.htm