基于boost asio开发的http server了解

给应用增加一个http远程访问接口,用于查询应用当前的状态。这也是为什么会要搞这个东西的原因之一。另外还有个原因,就是要通过标准的http协议,方便应用的分布式部署。

这个http server,完全是参照asio的example搞的,地址: http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3。惟一的改动,就是在request_handler类中,增加了一个注册url的接口。通过uri和对应的functor组成一对映射,在请求对应uri的时候,调用映射的functor。代码:

 代码如下 复制代码
void http::RequestHandler::registerPath(std::string path, RequestHandleFunc f)
{

    pathToRequestHandle.insert(std::pair<std::string, RequestHandleFunc>(path, f));

}

其中,RequestHandleFunc的定义为:

typedef boost::function<void (const Request &req, Reply &rep)> RequestHandleFunc;

这样,在原来RequestHandler::handleRequest的地方,就可以直接通过这个map中的值,获得真正处理请求的函数。

 代码如下 复制代码
std::map<std::string, RequestHandleFunc>::iterator funcIter = pathToRequestHandle.find(request_path);

if(funcIter == pathToRequestHandle.end())

{

    rep = Reply::stock_reply(Reply::not_found);

    return;

}

RequestHandleFunc f = funcIter->second;

f(req, rep);

当然,这里还可以扩展下,不直接保存uri,而是保存匹配uri的正则表达式。不过这样处理起来会比较麻烦,也有性能上的损耗,针对这种简单的应用,就暂时不加上这个功能了。

除了增加了注册处理函数,还对parse http请求进行了一些扩展:

    将query string从url中分离。这个功能主要是针对注册处理函数而修改的。原来的parse函数,将整个请求url都放在一个string中,导致后面的querystring不同,都需要重新注册。现在在Request类中增加了querystring这个变量,并将url中问号(‘?’)以后的字符放到这个变量中。
    增加了对body部分的保存。这个功能主要是后期可能会用来接收http put请求,接受远程的文件传输。

除了这写扩展,以后可能还要对http头的Authorization进行扩展,增加http server的安全性。目前这样可以基本实现http 1.0协议,应该已经差不多了,就最初的目的而言,短连接已经可以满足需求了。

抄了这么多代码,对boost的bind有了一定的了解,不过对share_ptr还是不太清楚。boost库里面很多的设计,都非常值得学习。

时间: 2024-09-20 08:36:59

基于boost asio开发的http server了解的相关文章

boost::asio译文

Christopher Kohlhoff Copyright 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完成独

boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_wrapper的特点效率高.跨平台.完全异步,当然这是从boost.asio继承而来:自动重连,数据透明传输,自动解决分包粘包问题(必须使用默认的打包解包器,这一特性表现得与udp一样):只支持tcp和udp协议: 三:st_asio_wrapper的大体结构st_asio_wrapper.h:编译器

linux下eclipse使用boost asio进行网络开发

问题描述 linux下eclipse使用boost asio进行网络开发 我按照官方文档编译了boost库并安装,然后我的eclipse工程下的/usr/local/include底下已经有了boost 接着我编译官网上的例子: #include #include #include using namespace std; using namespace boost; int main() { boost::asio::io_service io; boost::asio::deadline_t

muduo 与 boost asio 吞吐量对比

muduo (http://code.google.com/p/muduo) 是一个基于 Reactor 模式的 C++ 网络库,我在编写它 的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上. 测试对象 boost 1.40 中的 asio 1.4.3 asio 1.4.5 (http://think-async.com/Asio/Download) muduo 0.1.1 (http://muduo

使用Boost.Asio编写通信程序

摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容.   Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. ASIO的同步方式 ASIO库能够使用TCP.UDP.ICMP.串口来发送/接收数据,下面先介绍TCP协议的读写操作.对于读写方式,ASIO支持同步和异步两种方式,首先登场的是同步方式,下面请同步方式自我介绍

Muduo 网络编程示例(二) Boost.Asio 的聊天服务器

本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端 与服务端的 muduo 实现.这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能 .Muduo 的下载地址: http://muduo.googlecode.com/files/muduo-0.1.7-alpha.tar.gz ,SHA1 873567e43b3c2cae592101ea809b30ba730f2ee6,本文的完整代码可在线阅读 http://code.go

深入浅出Docker(五):基于Fig搭建开发环境

深入浅出Docker(五):基于Fig搭建开发环境 1. 概述 在搭建开发环境时,我们都希望搭建过程能够简单,并且一劳永逸,其他的同事可以复用已经搭建好的开发环境以节省开发时间.而在搭建开发环境时,我们经常会被复杂的配置以及重复的下载安装所困扰.在Docker技术未出现之前,我们可以使用Pupet.Chef.Ansible等配置管理工具把复杂的配置管理起来,这样的管理配置技术仍然是目前比较流行的方式之一.配置管理工具使用的都是自己的DSL语法定义,考虑到环境的复杂性,配置一套通用的开发环境需要针

boost.asio系列——Timer

同步Timer   asio中提供的timer名为deadline_timer,它提供了超时计时的功能.首先以一个最简单的同步Timer为例来演示如何使用它.     #include <iostream>    #include <boost/asio.hpp>     int main()    {        boost::asio::io_service io;        boost::asio::deadline_timer timer(io, boost::pos

boost.asio系列——socket编程

asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下:     #include <iostream>    #include <boost/array.hpp>    #include <boost/asio.hpp>     using boost::asio::ip::tcp;     int main(int argc, char* argv