《http篇》boost.asio下载和编译
boost简介
参考链接:https://blog.csdn.net/q893332169/article/details/115861618
boost 是一个跨平台的C++工具库,是的,没错!相当于一个大的工具集合。当然boost没有那么全面,比如界面库就没有。
boost编译和配置
参考链接:https://www.jb51.net/article/191861.htm
参考链接:https://blog.csdn.net/qq_45491628/article/details/131367797
下载
解压
我这里直接解压到D盘,解压后目录【D:\boost_1_73_0】
最上层结构:
#存放配置脚本和说明文件
├── boost # 最重要的目录,90%以上的Boost程序库源码都在这里
├── doc # HTML 格式的文档,也可以生成PDF格式文档
├── libs # 所有组件的示例、测试、编译代码和说明文档
├── more # 库作者相关的文档
├── status # 用于测试Boost库的各个组件
└── tools # b2、quickbook等自带工具
Boost目录结构:(在大多数情况下,我们只需要关心boost子目录,这里面以头文件的形式分门别类地存放了我们要使用的库代码)
├── accumulators # 累加器库
├── algorithm # 算法库
├── align # 内存对齐库
├── archive # 序列化库
├── asio # 异步并发库
├── assert # 断言库
├── assign # 赋值初始化库
├── atomic # 原子操作库
├── beast # 高级网络通信库
├── bimap # 双向关联数组
├── bind # bind表达式
├── chrono # 时间处理库
... # 其他库
├── python # python库 (把C++类和函数映射到Python之中)
├── yap # 表达式模板库
...
编译
注意:
1、Boost库的头文件与我们平常所用的头文件*.h或C++标准库的头文件(没有后缀名)不同,这正是Boost的独特之处。它把C++类的声明和实现放在了一个文件中,而不是分成两个文件,即.h+.cpp,故文件的后缀是.hpp。
2.这里需要说明一下,刚开始拿到压缩包解压后,想着能够像GDAL库一样,直接拷贝到工程目录下进行包含引用。然而发现引用进去文件报错不能打开。 所以boost库不能直接拷贝进去使用,对于有些文件还是需要编译一下静态库进而引用的。这里的编译与GDAL和OpenCV的安装有一定的区别,这里的编译安装,只是在对应的文件下生成静态库。
执行bat
以管理员身份运行“VS 2015 的 x64 本机工具命令提示”
执行命令
cd D:\
bootstrap.bat // 执行失败需要查看bootstrap.log,成功后会得到b2.exe,
如果没有生成b2.exe,说明生成失败,看bootstrap.log报错。这里是因为vs工具集版本原因。
参考链接:https://stackoverflow.com/questions/74348431/unknown-toolset-vcunk-executing-bootstrap-bat-of-boost-library
根据自己的vs版本改成对应命令就可以,例如我的是vs2015,改为使用命令【bootstrap.bat vc14】,下面是对应信息。
vs2008 : msvc-9.0,
vs2010 : msvc-10.0,
VS2012、VS2013:msvc-12.0
vs2017 : msvc-14.1,
vs2015 : msvc-14.0,
linux :gcc
执行b2.exe
bat执行完后会生成exe文件
在命令行中输入:
b2.exe
等待程序编译完成,会在目录下生成bin.v2和stage两个文件夹,其中bin.v2下是生成的中间文件,大小在2.4G左右,可以直接删除。stage下才是生成的lib文件。文件如下:
说明:
这里通过双击b2.exe进行编译的,默认在stage下生成lib文件夹,里面只包含着静态库。如果想要生成dll动态库,可./b2 --help查看参数说明,然后需要输入相应的编译命令如
配置
(图片目录与实际不一样,只是作位置参考)
1、项目(右键)->属性
2、点击vc++目录:包含目录添加【D:\boost_1_73_0】,库目录添加【D:\boost_1_73_0\stage\lib】
3、点击链接器->常规->附加库目录:添加【D:\boost_1_73_0\stage\lib】
测试使用
代码如下:
// 工程:属性 =》配置属性 =》C/C++ =》常规 =》附加包含目录 填上:D:\boost_1_73_0
// 工程:属性 =》配置属性 =》链接器 =》常规 =》附加库目录 填上:D:\boost_1_73_0\stage\lib
#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
int main(int argc, char* argv[])
{
std::string file;
std::cin >> file;
std::cout << file << " : " << file_size(file) << std::endl;
return 0;
}
http服务简单实现
参考链接(未用到):https://www.jb51.net/article/256649.htm
代码如下:
#include <iostream>
#include <boost/asio.hpp>
using namespace boost::asio;
using ip::tcp;
void handle_request(tcp::socket& socket)
{
try
{
boost::asio::streambuf buf;
read_until(socket, buf, "\r\n");
std::istream input(&buf);
std::string request_method;
input >> request_method;
// 解析请求方法、路径等信息
// 构建响应内容
std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!";
boost::asio::write(socket, boost::asio::buffer(response));
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
void start_server()
{
boost::asio::io_service io_service;
tcp::endpoint endpoint(tcp::v4(), 8000);
tcp::acceptor acceptor(io_service, endpoint);
while (true)
{
tcp::socket socket(io_service);
acceptor.accept(socket);
std::thread(handle_request, std::move(socket)).detach();
}
}
int main()
{
start_server();
return 0;
}
访问8000端口