C++写HTTP服务器

来源:互联网 发布:华为软件开发工资待遇 编辑:程序博客网 时间:2024/06/18 12:37

这个项目底层是用Boost.Asio库,通过正则表达式reg解析http,然后做出响应。
具体做法文末链接有详细介绍,在这里说一下这个项目得到的知识点,首先是reg正则表达式的用法

regex/regex_match/smatch

regex是用来定义正则表达式的,smatch是用来局部匹配的,regex_match是用来寻找的。具体用法如下:

string fnames[]= {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};    regex base_regex("([a-z]+)\\.txt");    smatch base_match;    for(auto &fname:fnames){        if(regex_match(fname,base_match,base_regex)){           for(int i=1;i<base_match.size();i++)               cout<<"sub-match "<<base_match[i]<<endl;        }    }

常用IO库

  • iostream
  • fstream
  • stringstream

getline

典型用法

string s;while(getline(cin,s)){    do();}
  • 输入回车,getline也不会跳出while,因为getline返回的是第一个参数,而不是第二个参数,所以只能用ctlr+z来退出
  • getline可以通过第三个参数来规定结束符,没有第三个参数,默认是”\n”,所以可以如下用法getline(cin,s,"#"),遇到‘#’即退出,但是要注意,如果输入hello#world,再输入!#,则第一次会得到hello,第二次会得到world!

rdbuf

典型用法

  • 文件复制fstream f1("1"); ftream f2("2");f1>>f2.rdbuf
  • stream类转string类stringstream ss;ostream os();os>>ss.rdbuf();
  • -

Boost.Asio 的buffer与streambuf

read可以用buffer,streambuf.
read_until只能用streambuf,
用streambuf好处是

  1. 不用自己开辟空间
  2. 可以很方便地与c++中的stream类共同处理
    streambuf典型用法如下
streambuf write_buf;ostream stream(write_buf.get());op_ostream();asyn_write(*socket,*write_buf)
streambuf read_buf;asyn_read(*socket,read_buf...);istream stream(read_buffer.get());op_stream();//在这里通过stream解析刚刚收到的东西

其他小知识点

  • 用到模板类,必须同时包含.hpp和.cpp,因为c++不能支持分离编译
  • openssl被分为两部分,apt-get install openssl是应用程序,而apt-get install libssl-dev是用于开发的库。安装完libssl-dev后,可以同pkg-config –libs openssl 来查看用openssl时,必须链接的库

项目讲解

本项目中,由于要同时支持http,https,所以先写了个基类BaseServer,然后HttpServer,HttpsServer,分别继承,因为,两种差别在于用到的socket,还用accept方式,http用的是ip::tcp::socket所以,https用的是ssl::stream,所以BaseServer是用模板,到时候再将不同的socket传入即可,因为只有accept不同,其他都一样,所以只需子类复写accept函数即可,又因为基类BaseServer的start函数中会调用accept()函数,为了能够让子类调用到他们自己的函数,所以,accept()必须为virtual。

参考链接
http://blog.csdn.net/watson2016/article/details/52415382

原创粉丝点击