C++ HttpServlet 高并发多线程 HTTP 服务器(转)

from:http://www.oschina.net/code/snippet_568966_43193

C/C++ 程序虽然执行效率高,但程序员在开发 WEB 应用时却因为没有好的 WEB 开发框架而导致开发效率低,所以 C/C++ 一般被用在开发执行效率高的后台服务器程序,目前有了跨平台网络通信与服务器框架(acl库)后这一情况得到很大改观,在 acl 库中提供了类似于 JAVA HttpServlet 的开发接口,大大提高了 C/C++ 程序员开发 WEB 应用的效率,acl 库中有完整的服务器开发框架,更使得 C/C++ 程序员可以快速地写出高效的 WEB 服务器程序。本例子为一个简单的 WEB 服务器程序,其在 acl 库中的位置:acl\lib_acl_cpp\samples\master_http_threads
acl 库下载:http://sourceforge.net/projects/acl/
acl 库的 github:https://github.com/zhengshuxin/acl
更多技术文章:http://zsxxsz.iteye.com
QQ 群:242722074

标签: acl

代码片段(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"

时间: 2024-10-01 05:57:04

C++ HttpServlet 高并发多线程 HTTP 服务器(转)的相关文章

分布式=高并发=多线程

当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程? 当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼? 确实,在一开始接触的时候,不少人都会将三者混淆,误以为所谓的分布式高并发的系统就是能同时供海量用户访问,而采用多线程手段不就是可以提供系统的并发能力吗?实际上,他们三个总是相伴而生,但侧重点又有不同. 什么是分布式? 分布式更多的一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段.该领域需要解决的问题极多,在

一个简单的高并发的回应服务器(5万并发)

一个简单的高并发的回应服务器,主要是使用boost的库! 自己测试过可以达到5万个并发! 程序的下载地址:http://download.csdn.net/detail/guanyijun123/8335907 #include <stdio.h> //#include "AuthenHandle.h" //#include "configure.h" //#include "NetSocketCommand.h" #ifdef WI

JAVA开发之大型互联网企业高并发架构Tomcat服务器性能优化视频教程

课程目标熟练掌握高并发架构Tomcat服务器性能优化. 适用人群对计算机,java开发人员,Java架构师,运维感兴趣的朋友! 课程简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而成.Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomc

百万级高并发WebRTC流媒体服务器设计与开发

第1章 课程导学与准备工作本章主要介绍为何要学习WebRTC流媒体服务器开发,以及本门课能为我们带来哪些收获.之后会为大家介绍本课程内容具体安排,最后给出如何学好这门课程的一些学习建议.希望大家都能通过这门课程,学有所成,学有所归. 第2章 C++语言基础回顾[已掌握,可略过]为了便于大家更好的学习流媒体服务器的开发,本章将带大家对WebRTC服务器开发中用到的C++基础知识进行回顾梳理,如类的定义与使用,继承,多态,名存空间等相关知识. 第3章 服务器基础编程本章将带你学习最基础的服务器开发,

百万级高并发WebRTC流媒体服务器设计与开发教程云

百万级高并发WebRTC流媒体服务器设计与开发 资源获取链接:点击获取完整教程 百万级高并发WebRTC流媒体服务器设计与开发 5G时代音视频为王,随着实时音视频应用的爆发,来自Google 的WebRTC成为了人们关注的焦点,但很多人却不知道如何使用WebRTC实现多人实时互动,本课就将围绕与浏览器互通.级联.可扩展等6大痛点手把手带你学习大负载.高并发.高性能 WebRTC 流媒体服务器的设计与开发,揭秘万人互动直播背后的深层奥秘,打造可负载百万用户量的企业级的流媒体服务器 播答题的核心需求

高并发IIS Web服务器常用设置

支持高并发的IIS Web服务器常用设置 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置:在IIS应用程序池高级设置中  General(常规)->Queue Length(对列长度)设置为65535(队列长度所支持的最大值) Process Model(进程模型

linux网络编程-----&gt;高并发---&gt;多线程并发服务器

做网络服务的时候并发服务端程序的编写必不可少.前端客户端应用程序是否稳定一部分取决于客户端自身,而更多的取决于服务器是否相应时间够迅速,够稳定. 常见的linux并发服务器模型: 多进程并发服务器 多线程并发服务器 select多路I/O转接服务器 poll多路I/O转接服务器 epool多路I/O转接服务器. 本次主要讨论多线程并发服务器模型: 使用多线程模型开发服务时需要考虑以下问题 1.  调整进程内最大文件描述符上限. 2.  线程如有共享数据, 考虑线程同步. 3.  服务于客户端线程

iOS从零开始学习socket编程——高并发多线程服务器

在上一篇文章<iOS从零开始学习socket编程--HTTP1.0服务器端>中我们已经简单的接触了OC搭建的HTTP服务器. (地址http://blog.csdn.net/abc649395594/article/details/45131373) 出于用户体验和鲁棒性考虑,这里把这个HTTP服务器改进成多线程的. 首先,AnsycSocket这个类是基于OC的Runloop实现的,Runloop实现了方法的异步调用但并不支持多线程. 在这里首先简单区分一下多线程和方法异步调用的区别.他们都

高并发解决方案之服务器优化

服务器的负载均衡: 四层负责均衡  .七层负载均衡缓存 硬盘级缓存:将需要动态生成的内容暂时缓存在硬盘上  内存级缓存:减少数据库查询次数 CPU与IO的均衡   如果发现某台服务器CPU负载很高而IO负载很低时,将某些耗CPU的进程换成耗IO的进程,达到均衡的目的,充分利用服务器资源,不会轻易崩溃 读写分离    如果是由于硬盘读写性能影响系统性能的话,将硬盘的写入换成 性能更高的硬盘 服务器脚本解析器选择   常见的有三种 asp,jsp,php 数据库的选择 硬件服务器的选择 服务器存储内