分类目录归档:C/OOC编程

网络编程–基于epoll+coroutine(协程)的EchoServer编程示例

以下为采用Linux下epoll+coroutine(协程)方式的EchoServer示例。 协程方式让异步回调的编码方式变为了顺序处理的编码方式,使得业务处理更易理解,以下示例使用云风开源的coroutine项目。 1.每个连接应该包含一个epoll_event和协程co,用于此连接上读写事件的监听,同时此连接上面还包含读写缓存、用户数据等 2. 客户端链接构造和析构函数 3. 异步编程,所有连接描述符都是非阻塞的 4. 主程序结构 5. 创建、并绑定本地端口 6. 服务器端应设置端口重用、关闭连接数据处理方式等socket option 7. 主进程/主线程监听到客户端 […]

[阅读全文...]

网络编程–基于epoll的EchoServer编程示例

以下为采用Linux下epoll方式的EchoServer示例 1.每个连接应该包含一个epoll_event,用于此连接上读写事件的监听,同时此连接上面还包含读写缓存、用户数据等 2. 客户端连接构造和析构函数 3. 异步编程,所有连接描述符都是非阻塞的 4. 主程序结构 5. 创建、并绑定本地端口 6. 服务器端应设置端口重用、关闭连接数据处理方式等socket option 7. 主进程/主线程监听到客户端连接的处理 8. 对客户端读事件的处理,读完成后要向事件驱动器中加入写事件监测 9. 对客户端写事件的处理,写事件完成后要从事件驱动器中停止写事件监测 备注:对于客 […]

[阅读全文...]

网络编程–基于libev的EchoServer编程示例

目前网上很多libev的EchoServer都非常简洁,在对客户端读写事件时的处理都不够明晰,现在简单介绍一个对一个客户端连接在进行异步读写时的处理,并给出一个可以执行的代码版本。 对于多进程/多线程编程框架还需要进行扩展,通常由主进程或线程启动异步事件驱动器进行网络监听,将客户端的连接放到业务处理线程自身的异步事件驱动器中,然后对每个客户端再进行业务处理,为避免客户端的慢操作或是耗时操作,业务线程还可以引入协程,对这些耗时操作使用协程处理,避免业务线程的阻塞。 1. 每个连接应该是一个独立的结构体,包含事件循环驱动器、事件读写监视器,以及此连接上面的读写缓存、用户数据等 […]

[阅读全文...]

OpenSSL编程-RSA编程详解

一. RSA PEM文件格式 1. PEM私钥格式文件 2. PEM公钥格式文件 3. PEM RSAPublicKey公钥格式文件 二. OpenSSL密钥相关命令 1. 生成密钥 2. 提取PEM格式公钥 3. 提取PEM RSAPublicKey格式公钥 4. 公钥加密文件 5. 私钥解密文件 三. RSA相关API 1. 基本数据结构 2. BN大数系列函数 3. RSA系列函数 4. PEM系列函数 5. RSA加密API 6. RSA解密API 四. RSA编程示例 1. 数据加、密解密示例 2. PEM/BIGNUM公钥转换示例 3. 密钥生成示例

[阅读全文...]

OpenSSL编程-3DES编程详解

一. 3DES加密原理 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代 […]

[阅读全文...]

OpenSSL编程-DES编程详解

一. DES加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的第8位作为奇偶校验位),产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 轮循环,使用异或,置换,代换,移位操作四种基本运算。 二. DES API 1. 基本数据结构 2. 基本宏定义 3. 设置密钥函数 4. DES ECB模式加解密API 5. DES CBC模式加解密 […]

[阅读全文...]

C语言编程规范

1. 背景 无论如何,标准是团队开发的保证之一,而且标准欢迎争吵和变化。我们使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。创建通用的、必需的习惯用语和模式可以使代码更加容易理解,在某些情况下改变一些编程风格可能会是好的选择,但我们还是应该遵循一致性原则,尽量不这样去做。 2. 环境 统一开发人员的开发环境,包括文本编辑环境、SHELL环境,通常我们使用VIM的UTF-8编码环境,使用4个空格代替Tab进行缩进。 3. 命名 头文件(.h 文件)和程序文件(.c文件)文件名全部 […]

[阅读全文...]

C语言算法-单链表的反转/逆序算法

平时的工作中通常会使用双链表进行链式的数据存储或是一些更高级的数据结构的构建(比如:栈、队列等),双向链表的正向、逆向遍历已经非常容易,而且系统库已经为我们构建好了非常高效的链表对象,比如著名的Linux内核链表对象:struct list_head,提供了非常丰富的链表操作方法。 如果从单纯的数据结构、算法实现角度讲,单链表也有很多值得研究的地方,今天介绍两种对单链表进行反转/逆序的算法: 1. 原地进行节点的反转/逆序 2. 从第三个节点开始,依次插入到头结点之后,并再将头节点移动到表尾 链表结构的定义,采用最简单的方式,数据单元直接采用整数对象进行数据存储,并且采用无 […]

[阅读全文...]

在C程序中内嵌Python解释器,用脚本语言实现灵活的Plugin机制

在经历过的一些大型项目中,很难独立使用一种开发语言完成任务,由于我这边的业务项目通常以服务器方面居多,从项目周期和运营维护角度考虑,既要考虑到程序的性能,又要考虑到业务功能变更和维护的便利性。 很多时候,我们都会以Python进行框架开发,在一些涉及到性能要求的时候以内嵌C模块的形式进行扩展,以提高整个项目的执行效率。然而我们还有很多以C语言开发的服务器项目,通常使用Prefork、MPM等多进程或多线程的框架,那么怎么才能做到灵活的对这些服务器程序的业务扩展或是Plugin功能呢? 以前在纯C语言时,我们通常采用so lib或是dlopen的方法,这样每次增加或是调整业务 […]

[阅读全文...]

网络服务器-Loopback (Internet Sockets) VS UNIX Domain Sockets

在本机的进程间通信中,TCP和UNIX域套接字是两种比较简单方便的通信方式,TCP基本以回路地址形式表现,回路地址在本机通信上还是要比UNIX域套接字多了封包/解包/校验和/序列确认等操作 那么对于这两种方式的性能比较可以参考以下文章: http://bhavin.directi.com/unix-domain-sockets-vs-tcp-sockets/ http://lists.freebsd.org/pipermail/freebsd-performance/2005-February/001143.html 同时做了一个简单的对比测试,虚拟机上(1CPU、256M […]

[阅读全文...]