coming
天行健 君子以自强不息
记录我的成长
前言 在项目的实现过程中,使用了不少优秀的第三方库,这里只介绍与C++网络编程相关的第三方库。
ev++ libev文档
libev的整体架构如下
boost库 1 Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。但Boost中也有很多是实验性质的东西,在实际的开发中使用需要谨慎。
boost库简单介绍
SQLite库 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。基本的使用逻辑如下:
1 调用sqlite3_reset()函数将准备好的语句对象重置回初始状态,以便重新执行。使用sqlite3_bind_*()API将值绑定到的任何SQL语句变量都会保留其值。使用sqlite3_clear_bindings()重置绑定。
BEGIN IMMEDIATE TRANSACTION
1 2 3 4 5 6 7 8 9 10 11 除非在事务内,否则不会进行读取或写入。任何访问数据库的命令(基本上是任何SQL命令,除了一些PRAGMA语句)都将自动启动一个事务(如果尚未生效)。自动启动的事务在最后一条SQL语句完成时提交。可以使用BEGIN命令手动启动事务。此类事务通常持续到下一个提交或回滚命令。但是,如果数据库关闭,或者发生错误并指定了回滚冲突解决算法,事务也将回滚。有关回滚冲突解决算法的更多信息,请参阅on CONFLICT子句的文档。END TRANSACTION是提交的别名。 使用BEGIN创建的事务。。。承诺不要嵌套。对于嵌套事务,请使用SAVEPOINT和RELEASE命令。上面语法图中显示的ROLLBACK命令的“TO SAVEPOINT name”子句仅适用于保存点事务。在事务中调用BEGIN命令的尝试将失败并出现错误,无论该事务是由保存点还是之前的BEGIN启动的。COMMIT命令和ROLLBACK命令(不带TO子句)对保存点事务的作用与对BEGIN启动的事务的作用相同。 SQLite支持来自不同数据库连接的多个同时读取事务,可能在不同的线程或进程中,但只支持一个同时写入事务。只读事务用于只读。写事务允许读和写。读事务由SELECT语句启动,写事务由CREATE、DELETE、DROP、INSERT或UPDATE等语句启动(统称为“写语句”)。如果在读事务处于活动状态时出现write语句,则读事务将升级为写事务(如果可能)。如果其他数据库连接已经修改了数据库或正在修改数据库,则无法升级到写事务,并且在SQLITE_BUSY时,write语句将失败。 当读事务处于活动状态时,启动读事务的数据库连接将看不到由单独的数据库连接实现的对数据库的任何更改。如果数据库连接X持有读取事务,则当X的事务仍处于打开状态时,其他一些数据库连接Y可能会更改数据库的内容,但是在事务结束之前,X将无法看到这些更改。当其读取事务处于活动状态时,X将继续在Y实施更改之前看到数据库的历史快照。 事务可以是延迟的、即时的或独占的。默认事务行为被延迟。延迟意味着在首次访问数据库之前,事务实际上不会启动。在内部,BEGIN DEFERRED语句只在数据库连接上设置一个标志,该标志关闭自动提交,该自动提交通常在最后一条语句完成时发生。这会导致自动启动的事务持续存在,直到显式提交或回滚,或者直到错误或ON CONFLICT ROLLBACK子句引发回滚。如果BEGIN DEFERRED之后的第一条语句是SELECT,则启动读取事务。如果可能的话,后续的write语句会将事务升级为write事务,或者返回SQLITE_BUSY。如果BEGIN DEFERRED之后的第一条语句是write语句,则会启动一个write事务。 立即导致数据库连接立即开始新的写操作,而无需等待write语句。如果另一个数据库连接上的另一个写事务已处于活动状态,则在SQLITE_繁忙时,立即开始可能会失败。EXCLUSIVE类似于IMMEDIATE,因为写入事务会立即启动。独占和立即在WAL模式中是相同的,但在其他日志记录模式中,独占阻止其他数据库连接在事务进行时读取数据库。
auto_vacuum
1 2 3 4 5 6 7 8 9 auto_vacuum的默认设置为0或“无”,除非使用SQLITE_default_AUTOVACUUM编译时选项。“无”设置意味着自动真空被禁用。当禁用自动真空并从数据库中删除数据时,数据库文件的大小保持不变。未使用的数据库文件页将添加到“自由列表”中,并在后续插入时重复使用。因此不会丢失任何数据库文件空间。但是,数据库文件不会收缩。在此模式下,真空命令可用于重建整个数据库文件,从而回收未使用的磁盘空间。 当auto_vacuum为1或“已满”时,自由列表页面将移动到数据库文件的末尾,数据库文件将被截断,以在每次事务提交时删除自由列表页面。但是请注意,自动抽真空只会截断文件中的自由列表页面。自动抽真空不会像vacuum命令那样对数据库进行碎片整理,也不会重新打包单个数据库页面。事实上,因为自动抽真空可以在文件中移动页面,所以它实际上会使碎片更严重。 只有当数据库存储了一些额外的信息,使每个数据库页面可以追溯到其引用者时,自动清空才可能。因此,在创建任何表之前,必须启用自动吸尘。创建表格后,无法启用或禁用自动真空。 当自动抽真空的值为2或“增量”时,自动抽真空所需的附加信息存储在数据库文件中,但自动抽真空不会在每次提交时自动发生,就像在auto_vacuum=full时一样。在增量模式下,必须调用单独的增量真空pragma以使自动真空发生。 The database connection can be changed between full and incremental autovacuum mode at any time. However, changing from "none" to "full" or "incremental" can only occur when the database is new (no tables have yet been created) or by running the VACUUM command . To change auto-vacuum modes, first use the auto_vacuum pragma to set the new desired mode, then invoke the VACUUM command to reorganize the entire database file. To change from "full" or "incremental" back to "none" always requires running VACUUM even on an empty database.
sigslot库 1 sigslot库 实质上是一个对象之间传递消息的库。一些复杂的工程,包含有大量的类。造成对象之间耦合度非常之大。该库实际上模拟了信号的发送对象send,以及信号的接受对象recv。然后将send对象的信号函数connect到对应的接收对象的函数实现。此时尽管调用send对象的类成员函数即可以完成recv对象的一些操作。这样在send对象中就不需要拥有recv对象的句柄,减小了耦合性。
sigslot库简介
sigslot库分析
WebSocket++ 1 WebSocket++ 是一个 C++ 库,可用于实现 WebSocket 功能。 该项目的目标是提供可移植、灵活、轻量级、底层和高性能的 WebSocket 实现。WebSocket++ 是一个只有标头的 C++ 库,它实现了 RFC6455 WebSocket 协议。 它允许将 WebSocket 客户端和服务器功能集成到 C++ 程序中。 它使用可互换的网络传输模块,包括一个基于原始字符缓冲区、一个基于 C++ iostreams 和一个基于 Asio(通过 Boost 或独立)。 最终用户可以根据需要编写额外的传输策略来支持其他网络或事件库。
WebSocket++文档
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!