C++ HttpServlet 高并发多线程 HTTP 服务器(转)
acl 库下载:http://sourceforge.net/projects/acl/
acl 库的 github:https://github.com/zhengshuxin/acl
更多技术文章:http://zsxxsz.iteye.com
QQ 群:242722074
代码片段(1)[全屏查看所有代码]
1. [代码][C/C++]代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
--------------------------- main.cpp ----------------------------------#include "stdafx.h"#include "master_service.h"int main(int argc, char* argv[]){ // 初始化 acl 库 acl::acl_cpp_init(); master_service& ms = acl::singleton2<master_service>::get_instance(); // 设置配置参数表 ms.set_cfg_int(var_conf_int_tab); ms.set_cfg_int64(var_conf_int64_tab); ms.set_cfg_str(var_conf_str_tab); ms.set_cfg_bool(var_conf_bool_tab); // 开始运行 if (argc >= 2 && strcmp(argv[1], "alone") == 0) { const char* addr = ":8888"; printf("listen on: %s\r\n", addr); ms.run_alone(addr, NULL, 0, 256); // 单独运行方式 } else ms.run_daemon(argc, argv); // acl_master 控制模式运行 return 0;}--------------------------- master_service.cpp ----------------------------------#include "stdafx.h"#include "master_service.h"////////////////////////////////////////////////////////////////////////////////// 配置内容项char *var_cfg_str;acl::master_str_tbl var_conf_str_tab[] = { { "str", "test_msg", &var_cfg_str }, { 0, 0, 0 }};int var_cfg_bool;acl::master_bool_tbl var_conf_bool_tab[] = { { "bool", 1, &var_cfg_bool }, { 0, 0, 0 }};int var_cfg_buf_size;acl::master_int_tbl var_conf_int_tab[] = { { "buf_size", 1024, &var_cfg_buf_size, 0, 0 }, { 0, 0 , 0 , 0, 0 }};long long int var_cfg_int64;acl::master_int64_tbl var_conf_int64_tab[] = { { "int64", 120, &var_cfg_int64, 0, 0 }, { 0, 0 , 0 , 0, 0 }};////////////////////////////////////////////////////////////////////////////////master_service::master_service(): res_buf_(NULL){}master_service::~master_service(){ if (res_buf_) acl_myfree(res_buf_);}bool master_service::thread_on_read(acl::socket_stream* stream){ logger("thread id: %lu", acl_pthread_self()); acl::http_response res(stream); // 响应数据体为 xml 格式 res.response_header().set_content_type("text/html"); // 读 HTTP 请求头 if (res.read_header() == false) return false; acl::string buf; // 读 HTTP 请求体数据 if (res.get_body(buf) == false) return false; acl::http_client* client = res.get_client(); // 判断客户端是否希望保持长连接 bool keep_alive = client->keep_alive(); // 返回数据给客户端 res.response_header() .set_status(200) .set_keep_alive(keep_alive) .set_content_length(var_cfg_buf_size); if (res.response(res_buf_, var_cfg_buf_size) == false) return false; return keep_alive ? true : false;}bool master_service::thread_on_accept(acl::socket_stream* conn){ if (0) acl_tcp_so_linger(conn->sock_handle(), 1, 0); logger("thread id: %lu", acl_pthread_self()); return true;}bool master_service::thread_on_timeout(acl::socket_stream*){ return false;}void master_service::thread_on_close(acl::socket_stream*){ logger("thread id: %lu", acl_pthread_self());}void master_service::thread_on_init(){}void master_service::thread_on_exit(){}void master_service::proc_on_init(){ logger("thread id: %lu", acl_pthread_self()); if (var_cfg_buf_size <= 0) var_cfg_buf_size = 1024; res_buf_ = (char*) acl_mymalloc(var_cfg_buf_size + 1); int i; for (i = 0; i < var_cfg_buf_size; i++) res_buf_[i] = 'X'; res_buf_[i] = 0;}void master_service::proc_on_exit(){}------------------------------- master_service.h -------------------------------#pragma once#include "acl_cpp/master/master_threads.hpp"#include "acl_cpp/master/master_conf.hpp"////////////////////////////////////////////////////////////////////////////////// 配置内容项extern char *var_cfg_str;extern acl::master_str_tbl var_conf_str_tab[];extern int var_cfg_bool;extern acl::master_bool_tbl var_conf_bool_tab[];extern int var_cfg_buf_size;extern acl::master_int_tbl var_conf_int_tab[];extern long long int var_cfg_int64;extern acl::master_int64_tbl var_conf_int64_tab[];//////////////////////////////////////////////////////////////////////////////////class acl::socket_stream;class master_service : public acl::master_threads{public: master_service(); ~master_service();protected: /** * 纯虚函数:当某个客户端连接有数据可读或关闭或出错时调用此函数 * @param stream {socket_stream*} * @return {bool} 返回 false 则表示当函数返回后需要关闭连接, * 否则表示需要保持长连接,如果该流出错,则应用应该返回 false */ virtual bool thread_on_read(acl::socket_stream* stream); /** * 当线程池中的某个线程获得一个连接时的回调函数, * 子类可以做一些初始化工作 * @param stream {socket_stream*} * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不 * 必将该连接再传递至 thread_main 过程 */ virtual bool thread_on_accept(acl::socket_stream* stream); /** * 当某个网络连接的 IO 读写超时时的回调函数,如果该函数返回 true 则表示继续等待下一次 * 读写,否则则希望关闭该连接 * @param stream {socket_stream*} * @return {bool} 如果返回 false 则表示子类要求关闭连接,而不 * 必将该连接再传递至 thread_main 过程 */ virtual bool thread_on_timeout(acl::socket_stream* stream); /** * 当与某个线程绑定的连接关闭时的回调函数 * @param stream {socket_stream*} */ virtual void thread_on_close(acl::socket_stream* stream); /** * 当线程池中一个新线程被创建时的回调函数 */ virtual void thread_on_init(); /** * 当线程池中一个线程退出时的回调函数 */ virtual void thread_on_exit(); /** * 当进程切换用户身份后调用的回调函数,此函数被调用时,进程 * 的权限为普通受限级别 */ virtual void proc_on_init(); /** * 当进程退出前调用的回调函数 */ virtual void proc_on_exit();private: char* res_buf_;};----------------------------- stdafx.h ---------------------------------------// stdafx.h : 标准系统包含文件的包含文件,// 或是常用但不常更改的项目特定的包含文件//#pragma once//#include <iostream>//#include <tchar.h>// TODO: 在此处引用程序要求的附加头文件#include "lib_acl.h"#include "acl_cpp/lib_acl.hpp" |
C++ HttpServlet 高并发多线程 HTTP 服务器(转)的更多相关文章
- HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器
HttpServer的特点1.完全采用IOCP模型,实现真正的异步IO,高并发.高可靠: 2.支持4G以上文件下载: 3.支持断点续传: 4.轻量级,体积小,服务器文件仅200多K,无任何依赖库: 5 ...
- IM服务器:开发一个高并发的IM服务器难在哪
IM服务器要实现的最基本功能就是消息的转发.--好像是一句废话! 这就意味着IM服务器要为每个登录用户创建一个与该用户信息相关的内存上下文,为方便描述我们在这里称之为:user_context.use ...
- 高并发 多线程批量ping工具 nbping简介和使用
nbping 简介 nbping是为解决局域网大批量IP实例或主机探活,采用go协程并发处理,可以自定义并发的协程数量和输出结果.效率远高于现有的批量ping工具. nbping具备如下特性 - 支持 ...
- Java高并发-多线程基础
一.什么是线程 线程是进程内的执行单元. 二.线程的基本操作 2.1 状态与操作 2.2 新建线程 Thread t1 = new Thread(new CreateThread()); t1.sta ...
- java多线程高并发
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81293321 “高并发和多线程”总是被一起提 ...
- php-fpm和cgi,并发响应的理解以及高并发和多线程的关系
首先搞清楚php-fpm与cgi的关系 cgi cgi是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据. php-cgi php-c ...
- python高并发和多线程的关系
“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程 多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现. 高并发是一种系 ...
- 在CentOS上使用Nginx和Tomcat搭建高可用高并发网站
目录 目录 前言 创建CentOS虚拟机 安装Nginx 安装Tomcat 安装lvs和keepalived 反向代理 部署网站 搭建数据库 编写网站项目 解决session一致性 注意 参考资料 前 ...
- JAVA架构师眼中的高并发架构,分布式架构 应用服务器集群
前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...
随机推荐
- 共享参数ContentProvider 类与数据库绑定,如何通过共享参数测试类,测试数据库的增删改查功能
Intent可以传一个对象 当两个界面之间跳转时,需要传递一个对象过去,是通过使用Bundle类,并且实体类需要serializable实现序列化,传递方法如下: 定义一个静态常量作为key值 pub ...
- Objective-C 内存管理之 _ARC
内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...
- JS原型,Prototype,原型
对于javascript这样一种前端语言,个人觉得,要真正的理解其oop, 就必须要彻底搞清楚javascript的对象,原型链,作用域,闭包,以及this所引用的对象等概念.这些对弄明白了,应该就可 ...
- PHP 提交checkbox表单时 判断复选框是否被选中
function GetTitleImgPath(){ $titleImgPath = ""; if (isset($_POST["titlecheckbox" ...
- javascript限制input只允许输入数字
在做数据提交的表单时,经常要对input输入内容的类型进行限制,譬如javascript限制input只允许输入数字,最好的方法当然是使用javascript,因为它不用与服务器交互,大大减轻了服务器 ...
- java.util.List org.apache.struts2.components.Form.getValidators(java.lang.String) threw an exception
在使用ajax主题时出现上述错误的解决办法是将form表单中的action属性值改为*.action后就可以解决.至于为什么会这样不太明白.但是修改action的属性值以后就会出现另一个错误即 对应的 ...
- Android加载图片小结
应用中用到图片加载需要解决的问题 无网络环境下图片不可用 图片的本地缓存,或者默认预加载的图片 低配置机型,加载图像资源超内存(OutOfMemory, OoM) 需要合理使用内存,尤其是bitmap ...
- laravel post请求失败
今天继续研究laravel,在路由里注册了一个控制器路由Route::controller(). 先get请求一个页面 class UserController extends Controller{ ...
- codeforces 383C Propagating tree 线段树
http://codeforces.com/problemset/problem/383/C 题目就是说, 给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...
- [LeetCode]题解(python):153-Find Minimum in Rotated Sorted Array
题目来源: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 题意分析: 在一个不重复的翻转的数组里面找到最小那个 ...