IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Boost-SSL-socket使用记录 -> 正文阅读

[C++知识库]Boost-SSL-socket使用记录

平台Windows

  • 重点声明
boost中的asio库,并不是编译出来的,而是模板编译的。你在stage/lib/cmake中是找不到的,asio的包的。
asio的ssl支持,使用的是OpenSSL库,因此,需要自己安装OpenSSL库,才能使用。安装OpenSSL之后,仍然需要在项目中引入OpenSSL库,否则会出现头文件、未定义的等等一系列错误。如果你是在windows下,我建议你使用OpenSSL的静态库链接,这样比较简单。下面是代码示例。还有一点,windows的OpenSSL会使用windows的库,所以需要链接#pragma comment(lib, "Crypt32.lib") 
  • 代码示例
    CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(boost-test LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置boost搜索路径前缀
set(CMAKE_PREFIX_PATH "D:/library/boost_1_76_0/stage/lib/cmake")

find_package(Boost REQUIRED COMPONENTS json)

add_executable(boost-test main.cpp SslClient.cpp)

# 设置ssl库路径
set(ssl_path "C:/Program Files/OpenSSL-Win64/lib/VC/static/")

# 如果找到boost json库的操作
if (Boost_FOUND)
# 设置头文件,并且链接boost json库以及OpenSSL的静态库
    include_directories(${Boost_INCLUDE_DIRS} "C:/Program Files/OpenSSL-Win64/include")
    target_link_libraries(${PROJECT_NAME} Boost::json ${ssl_path}libssl64MT.lib ${ssl_path}libcrypto64MT.lib)
endif()

SslClient.h

#ifndef SSLCLIENT_H
#define SSLCLIENT_H

#include <boost/noncopyable.hpp>
#include <boost/json.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <boost/asio/ssl/stream_base.hpp>
#include <boost/lexical_cast.hpp>
#include <string>

class SslClient : public boost::noncopyable
{
public:
    using TcpSocketType = boost::asio::ip::tcp::socket;
    using SslSocketType = boost::asio::ssl::stream<TcpSocketType>;
    
    explicit SslClient(boost::asio::io_context& io) noexcept;
    void start();  
    void handleRead(const boost::system::error_code& error, std::size_t num) noexcept;

    std::string domain;			// 域名
private:
  char _buffer[2048];
  boost::asio::io_context& _io;			
  boost::asio::ssl::context _ctx;			// ssl 上下文协议
  SslSocketType _stream;					// ssl - tcp 流,需要注意的是,该对象内部成员就是 tcp-socket

};

#endif // SSLCLIENT_H

SSLClient.cpp

#include "sslclient.h"
#include <iostream>

// 初始化,设置ssl上下文以及ssl-stream
SslClient::SslClient(boost::asio::io_context& io) noexcept
    : _io(io), _ctx(boost::asio::ssl::context::sslv23), _stream(io, _ctx) {}

void SslClient::start() {
// 解析域名拿到ip地址
    boost::asio::ip::tcp::resolver resolver(_io);
    boost::asio::ip::tcp::resolver::query query(domain, boost::lexical_cast<std::string>(443));
    auto begin = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end;
    if (begin == end)
        return;
	
	// 获取底层的tcp套接字,先链接tcp
    _stream.lowest_layer().connect(begin->endpoint());	
	// 进行ssl握手
    _stream.handshake(SslSocketType::handshake_type::client);

    const char* strHeader =
            "GET / HTTP/1.1\r\n"
      "Host: www.baidu.com\r\n"
      "Connection: keep-alive\r\n"
      "\r\n";
	
	// 发送请求头
    _stream.write_some(boost::asio::const_buffer(strHeader, std::strlen(strHeader)));
	
	// ssl 进行读取
    _stream.async_read_some(boost::asio::buffer(_buffer, sizeof(_buffer)),
                            std::bind(&SslClient::handleRead, this,
                                      std::placeholders::_1,
                                      std::placeholders::_2)
                            );

}

void SslClient::handleRead(const boost::system::error_code& error, std::size_t num) noexcept {
    try {
        if (error) {
            if (num == 0) {
                _stream.shutdown();
                _stream.lowest_layer().close();
            }
            return;
        }


        _buffer[num] = '\0';
        std::cout << _buffer;
		
		// 继续监听异步读取
        _stream.async_read_some(boost::asio::buffer(_buffer, sizeof(_buffer)),
                                std::bind(&SslClient::handleRead, this,
                                          std::placeholders::_1,
                                          std::placeholders::_2)
                                );


    } catch(const std::exception&) {

    }
}

main.cpp

#include <iostream>
#include <boost/lexical_cast.hpp>
#include "sslclient.h"

// 因为OpenSSL会使用win32底层的库,所以一定要链接这个库,否会出现未定义的错误
#pragma comment(lib, "Crypt32.lib")

int main(int, char**)
{
  std::cout << "hello asio\n";
  boost::asio::io_context io;
  SslClient app(io);
  app.domain = "www.baidu.com";
  app.start();
  io.run();
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-04 19:21:28  更:2021-07-04 19:21:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 1:06:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码