前段时间朋友急需让我帮忙搞定个C++的http库????然后指定了hpsocket这个库。看了一下是国人写了,资料在doc还算比较全,整理了很多框架的部分也挺详细,正好在补基础,所以学习下http后端的一些概念,也学习学习别人的代码。时间比较匆忙,就按照从先从自身的需求出发再到后面可以研究库的源代码思路进行。
这个库是跨平台的,我选择的环境平台是Linux。我的电脑是ubuntu16的
测试demo git
填充
0.目标
作为工作首先要解决的工作:
实现一个HTTP服务,可以实现HTTP收发的功能。
1.编译安装
编译
./compile.sh
需要把HTTP这选项打开
作者在说明文档中标注了demo/目录不参与这个命令的编译。
demo下的项目都是sln组织的,需要安装和配置Visual C++ for Linux Development插件。
还有部分是编译是通过ndk,这部分也先不管他。
另外这个好像要C++14编译。所以GCC的版本也需要要求5.X以上。
安装
./install.sh
这步我就不装了没啥必要,编译完了就OK了,前面那步会把边的库放在lib目录下
2.实现
实现主要分为两部分:客户端和服务器。服务器是是实现重点。
2.1.服务器
服务器的参考代码我是参考demo/testecho-http的代码。
参考代码中加了命令行控制的代码,看着代码就比较多。这边我把代码重新整理一下,写一个新的demo。新的demo里我就考出了http服务
首先除了库的头文件,包括依赖到一个文件,再demo/gloabl/下的helper.cpp及helper.h。helper.cpp和helper中间包括一些宏定义,配置参数,命令行类之类的,可能还涉及到其他demo中需要的一些宏和定义。
把中间和HTTP有关有用的抽出来放到新建的myhelper.cpp和myhelper.h里。
myhelper.h
首先是包括的头文件
#include
#include
#include
#include
#include
#include
//#include "include/hpsocket/SocketInterface.h"
//#include "include/hpsocket/HPTypeDef.h"
//#include "include/hpsocket/common/GlobalDef.h"
#include "src/common/StringT.h"
#include "src/HttpServer.h"
#include "src/common/FuncHelper.h"
这里我一开始想用include的库的头文件,发现好多类没有(不过像一些类其实完全可以用自己实现)。这里为了拖原demo方便,就先使用到src源代码的头文件了。不过这里的接口也确实很迷???
然后再试一些服务器参数宏
#define IPV4_LOOPBACK_ADDRESS _T("127.0.0.1")
#define IPV6_LOOPBACK_ADDRESS _T("::1")
#define IPV4_ANY_ADDRESS _T("0.0.0.0")
#define IPV6_ANY_ADDRESS _T("::")
#define DEF_MULTI_CAST_ADDRESS _T("233.0.0.1")
#define BROAD_CAST_ADDRESS _T("255.255.255.255")
#define DEF_TCP_UDP_PORT 5555
#define DEF_HTTP_PORT 8080
#define DEF_HTTPS_PORT 8443
#define TCP_KEEPALIVE_TIME (60 * 1000)
#define UDP_DETECT_ATTEMPTS 3
...
#define HTTP_NAME _T("http")
#define HTTPS_NAME _T("https")
#define STR_HTTP_SCHEMA "http://"
#define STR_HTTPS_SCHEMA "https://"
#define CRLF "\r\n"
#define NV_SEPARATOR_CHAR '='
#define HEADER_SEPARATOR ": "
#define COOKIE_TOKENIZE "; "
#define STR_HTTP_1_0 "HTTP/1.0"
#define STR_HTTP_1_1 "HTTP/1.1"
#define HOST_HEADER "Host"
#define COOKIE_HEADER "Cookie"
#define SET_COOKIE_HEADER "Set-Cookie"
#define CONTENT_TYPE_HEADER "Content-Type"
#define CONTENT_LENGTH_HEADER "Content-Length"
#define TRANSFER_ENCODING_HEADER "Transfer-Encoding"
#