OpenRTMFP/Cumulus Primer(4)CumulusServer启动流程分析
首先要知道的是,OpenRTMFP/Cumulus
中使用到的库有 Poco、OpenSSL 和 Lua。
1 main.cpp 中的 main() 函数
入口在 main.cpp 中:
int main(int argc, char* argv[]) {
先检查内存泄露,不过目前这个开发中的项目还没有实现这个功能,只是个空函数:
DetectMemoryLeak();
然后会创建一个匿名的 CumulusServer 对象,并调用其 run() 函数,该函数由 CumulusServer 从 ServerApplication 中继承而来,而 ServerApplication 由是从 Application 继承而来的。CumulusServer 对象调用 run() 函数,实际是 ServerApplication 的 run() 函数,ServerApplication 的 run() 函数则是调用 Application 的函数,而该 run() 函数则是先调用 initialize() 函数,然后调用 main() 函数,然后调用 uninitialize() 函数。如果 initialize() 函数被调用时抛出异常,则不会执行 main() 函数,但仍然会执行 uninitialize() 函数:
// Runs the application by performing additional initializations
// and calling the main() method.
return CumulusServer().run(argc, argv);
}
2 main.cpp 中的 CumulusServer() 构造函数
CumulusServer 的构造函数定义为:
CumulusServer(): _helpRequested(false), // 显示帮助信息
_pCirrus(NULL),
_middle(false),
_isInteractive(true),
_pLogFile(NULL) {
}
3 main.cpp 中的 CumulusServer 的 initialize() 成员函数
在执行 main() 函数之前,CumulusServer 会启动 initialize() 函数,传入的参数就是 CumulusServer 自己,可以猜到 Poco::Util::Application 的 run 方法中,调用该函数时的参数是this
。
void initialize(Application& self) {
调用父函数 ServerApplication 的初始化函数:
ServerApplication::initialize(self);
再继续下面的源码分析之前,先要知道,根据Poco::Util::Application
,Application 类有一些内置的配置属性,如下:
-
application.path: 可执行文件的绝对路径;
-
application.name: 可执行文件的文件名(含扩展名);
-
application.baseName: 可执行文件的文件名(不含扩展名)
-
application.dir: 可执行文件的所在目录;
-
application.configDir: 配置文件所在目录;
所以下面就读取了可执行文件的所在目录,其中第二个参数表示默认值(即当前目录):
string dir = config().getString("application.dir", "./");
然后读取配置文件,目录为上一句所得到的dir
,文件名(不含扩展名)为application.basename
内置配置属性值,其默认值为CumulusServer
,然后加上点和扩展名.ini
。
loadConfiguration(dir
+ config().getString("application.baseName", "CumulusServer")
+ ".ini");
这样就加载完配置了。然后查看当前的进程是从命令行运行的(命令行是交互的,所以是 interactive),还是以 daemon 方式运行的,这个函数是ServerApplication
的一个成员函数:
_isInteractive = isInteractive();
然后获取表示日志文件所在目录的字符串,其中logs.directory
是外置配置属性(配置文件中),其默认值为上面获取到的可执行文件路径(一般为当前路径)与logs
的组合,即一般为当前目录下的logs
目录:
string logDir(config().getString("logs.directory", dir + "logs"));
创建日志文件目录:
File(logDir).createDirectory();
日志文件绝对路径,logs
为默认的日志文件名(不含扩展名的部分),扩展名用0
:
_logPath = logDir + "/" + config().getString("logs.name", "log") + ".";
_pLogFile = new File(_logPath + "0");
用日志流打开日志文件(方式为追加写入):
_logStream.open(_pLogFile->path(), ios::in | ios::ate);
Logs 是一个方法类(其中的 public 函数都是静态的),SetLogger
的作用就是将Logs
中的似有静态成员设置为某个 Cumulus::Logger 对象(由于 CumulusServer 继承了 Cumulus::Logger)。
Logs::SetLogger(*this);
}
4 main.cpp 中的 CumulusServer 的 main() 成员函数
OpenRTMFP/Cumulus
是一个基于Poco::Util::Application
的服务端应用(准确的说是基于Poco::Util::ServerApplication
的服务端应用)。如果没有特殊的启动要求,可以调用Poco/Application.h
中定义的宏POCO_APP_MAIN
来完成初始化、日志和启动(该宏会根据不同的平台启用不同的main()
函数)。
run() 函数在调用完 initialize() 函数后,会调用 CumulusServer 中的 main() 函数,该 main() 函数的定义在 main.cpp 中:
int main(const std::vector<std::string>& args) {
首先看是否是要求帮助信息,displayHelp
是借助Poco::Util::HelpFormatter
实现的,CumulusServer
的构造函数会在调用时将_helpRequested
设置为false
。
if (_helpRequested) {
displayHelp();
}
如果不是,则进入启动状态,首先创建一个RTMFPServerParams
对象params
,用来存储OpenRTMFP/CumulusServer
的基本配置信息。
else {
try {
RTMFPServerParams params;
params
存储CumulusServer
的端口号和CumulusEdge
的端口号:
params.port = config().getInt("port", params.port);
UInt16 edgesPort = config().getInt("edges.port",
RTMFP_DEFAULT_PORT+1);
if(config().getBool("edges.activated",false)) {
if(edgesPort==0)
WARN("edges.port must have a positive value if \
edges.activated is true. Server edges is \
disactivated.");
params.edgesPort=edgesPort;
}
_pCirrus
为SocketAddress
的成员,是封装IP地址和端口号的对象。
params.pCirrus = _pCirrus;
params.middle = _middle;
UDB 所使用的缓冲区大小:
params.udpBufferSize = config().getInt("udpBufferSize",
params.udpBufferSize);
params.keepAliveServer = config().getInt(
"keepAliveServer",params.keepAliveServer);
params.keepAlivePeer = config().getInt("keepAlivePeer",
params.keepAlivePeer);
失败前CumulusEdge
的尝试次数:
params.edgesAttemptsBeforeFallback = config().getInt(
"edges.attemptsBeforeFallback",
params.edgesAttemptsBeforeFallback);
Server server(config().getString("application.dir","./"),
*this,config());
server.start(params);
waitForTerminationRequest()
函数是main()
函数中必须调用的,意为等待终止运行的操作请求。
// wait for CTRL-C or kill
waitForTerminationRequest();
一旦接收到终止操作的请求,就会执行下面这句,用以退出OpenRTMFP/Cumulus
的运行:
// Stop the server
server.stop();
catch 一些可能产生的异常:
} catch(Exception& ex) {
FATAL("Configuration problem : %s",ex.displayText().c_str());
} catch (exception& ex) {
FATAL("CumulusServer : %s",ex.what());
} catch (...) {
FATAL("CumulusServer unknown error");
}
}
OpenRTMFP/CumulusServer 停止运行:
return Application::EXIT_OK;
}
-
转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant
-
分享到:
相关推荐
《OpenRTMFP Cumulus Primer 入门与CumulusServer部署》 OpenRTMFP (Real Time Media Flow Protocol) 是一种技术,它为Flash实时应用提供了高并发扩展能力。OpenRTMFP/Cumulus是基于GNU General Public License的...
openrtmfp又名Cumulus Server是一个完全开源和跨平台的可扩展的RTMFP服务器脚本。Cumulus Server在GPL 框架下遵循速度、优势、跨平台、轻量和高质量代码。Cumulus Server的每一个版本都是通过严格测试和审核的。可...
4. **硬件兼容性**:Cumulus Linux支持多种白盒和商用现成(COTS)硬件,这降低了网络设备的成本,同时也使得用户可以选择最适合其需求的硬件平台。 5. **VXLAN支持**:VXLAN(Virtual eXtensible Local Area Network...
高性能计算云 目标 ...$ vi /opt/hpccloud/cumulus/cumulus/conf/config.json +- > Fix host to be localhost +- > baseUrl: " http://localhost:8080/api/v1 " , $ sudo service celeryd restar
4. **测试应用**:启动CumulusServer,然后使用CumulusClient或者自定义的客户端连接到服务器,发送"hello"消息,你应该能收到"world"的回复。 5. **调试和优化**:Lua提供了方便的错误处理和日志记录功能,可以...
这本食谱在 vanilla Debian 上创建了一个交换机覆盖,并且还部署在 Cumulus 路由器/交换机上。 要求 测试 访问 Debian Wheezy 盒子 生产 访问 Cumulus HCL [1] 开关(Accton AS6701_32X,这就是这本食谱最初的目的)...
2. **易用性**:尽管拥有丰富的自定义选项,但`wp-cumulus`的基本安装和使用过程相当简单,适合新手和专业人士。 3. **多语言支持**:除了英文,`wp-cumulus`对中文的支持使得它在全球范围内具有更广泛的适用性。 ...
Cumulus可能是基于Web的项目管理工具或者数据分析平台,而`swfobject.js`和`tagcloud.swf`这两个文件名暗示了它可能与Flash交互和数据可视化有关。 `swfobject.js`是一个JavaScript库,主要用于在网页中嵌入Adobe ...
5. **错误处理和恢复**:如果在传输过程中出现错误,如网络中断,Cumulus会尝试恢复连接或者重新建立P2P链路。 6. **断开连接**:当通信结束时,客户端会关闭P2P连接,释放资源。 通过这样的机制,Flex P2P 音视频...
4. **系统架构与实现**:Cumulus 修改了Hadoop的源代码,以支持网络编码的存储和检索流程。这包括对NameNode和DataNode的角色重新定义,以及对Block和BlockReplica的概念进行扩展,以适应编码块的管理。 5. **性能...
在使用过程中,确保你的网站已经安装了Flash插件,因为"wp-cumulus" 在运行时需要依赖Flash支持。不过,随着HTML5技术的发展,一些现代版本可能提供了HTML5替代方案,以便在不支持Flash的设备上也能正常显示。 总的...
《WordPress中的wp-cumulus 3D云标签详解》 在WordPress这个强大的开源博客平台中,wp-cumulus是一款极具特色的3D云标签插件。它以其独特的视觉效果和交互体验,为用户提供了全新的标签展示方式,使得博客的分类和...
这里给出了cumulus/OpenRTMFP的git官网提到的视频会话样例的AS3代码,包括服务器端和客户端两部分,我已经在<使用Cumulus和Flash Player搭建视频会议示例>http://blog.csdn.net/tao_627/article/details/18041473中给...
积云Cumulus 是的免费、开源替代品,它利用您自己的 S3 进行存储。下载您可以在下载最新版本更改默认截图目录这是可选的。 默认情况下,OS X 会将屏幕截图放在您的桌面上。 但是,如果您希望他们去其他地方,您可以...
积云框架 :open_book: 文献资料 最新文档。 文档。 更多信息 有关此项目的更多信息,以及有关NASA的地球观测系统数据和信息系统(EOSDIS)及其云工作的更多信息,请联系或访问 。...这是用于Cumulus开
大名鼎鼎的WP-CUMULUS 3D标签云,已经改成支持中文标签,可在.htm自行添加标签链接,可以单机玩耍测试,不需要安装WordPress然后装插件~~ 主要是有些童鞋只是想要3D标签云动画,所以就提取重要文件出来稍作修改下.
【标题】"wp-cumulus.rar" 是一个与WordPress相关的压缩包,其中包含"TagCloud._TagCloud.as",这表明它与创建和展示WordPress标签云的插件有关。"flex cumul_wp cumulus_wp cu"暗示这个插件可能是用Adobe Flex技术...
Cumulus集成测试项目[已弃用] 注意:此存储库不再维护。 该存储库的内容已移至。 什么是积云? Cumulus是NASA未来地球科学数据流的基于云的数据提取,存档,分发和管理原型。 阅读 安装 nvm use npm install 在...
或者,它可能包含了一些数据处理和分析的工具,帮助开发者快速处理大量数据。 Python库的版本管理也非常重要。版本号1.1.0意味着这是一个相对稳定的版本,相较于早期版本,它可能修复了一些已知问题,增加了新功能...
Mellanox Cumulus学习,基本使用,培训资源