【问题标题】:Creating a HTTPS request using Boost Asio and OpenSSL使用 Boost Asio 和 OpenSSL 创建 HTTPS 请求
【发布时间】:2016-10-14 06:58:55
【问题描述】:

我创建了一个简单的 HTTP 请求,其中我向服务器发送 GET、POST 和 PUT 请求。接下来我想使用 boost asio 库切换到 HTTPS 连接,我应该怎么做?

我有一个解析并连接到服务器的 Executor 类和一个创建请求的 RequestCreator 类。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    我恰好在评论中发布了这样的事情(...):

    You just connect over ssl. @Milind coliru.stacked-crooked.com/a/9546326fd1def416

    所以也许对你有帮助。

    Live On Coliru

    #include <boost/asio.hpp>
    #include <boost/asio/ssl.hpp>
    #include <iostream>
    
    int main() {
        boost::system::error_code ec;
        using namespace boost::asio;
    
        // what we need
        io_service svc;
        ssl::context ctx(svc, ssl::context::method::sslv23_client);
        ssl::stream<ip::tcp::socket> ssock(svc, ctx);
        ssock.lowest_layer().connect({ {}, 8087 }); // http://localhost:8087 for test
        ssock.handshake(ssl::stream_base::handshake_type::client);
    
        // send request
        std::string request("GET /newGame?name=david HTTP/1.1\r\n\r\n");
        boost::asio::write(ssock, buffer(request));
    
        // read response
        std::string response;
    
        do {
            char buf[1024];
            size_t bytes_transferred = ssock.read_some(buffer(buf), ec);
            if (!ec) response.append(buf, buf + bytes_transferred);
        } while (!ec);
    
        // print and exit
        std::cout << "Response received: '" << response << "'\n";
    }
    

    为了模拟服务器以进行演示,我一直在使用 Asio 示例 (https://stackoverflow.com/a/31201907/85371) 中的证书和参数。

    更新这是一个使用解析器来解析端点的版本(Coliru 不允许我们这样做,但它可以在不受限制的机器上工作)。

    Live On Coliru

    ip::tcp::resolver resolver(svc);
    auto it = resolver.resolve({"localhost", "8087"}); // http://localhost:8087 for test
    boost::asio::connect(ssock.lowest_layer(), it);
    
    // and the rest unaltered
    ssock.handshake(ssl::stream_base::handshake_type::client);
    

    【讨论】:

    • 这似乎不起作用,因为我使用的是解析器而不是端点 tcp::resolver resolver(ioService); tcp::resolver::query query(cli.getIP(), "8080");
    • 不要提供boost网站或github示例代码的链接,我已经尝试了所有这些(几乎所有)
    • 你有没有使用解析器@sehe建立连接的自定义代码
    • @DevMac 有时间回答您的评论,请参阅更新。您发现哪些在线示例比这更令人困惑?
    • auto 不依赖于编译器。在 c++11 引入它的意义上,它依赖于标准版本。所有编译器都在 c++11 模式下支持它。优雅的关闭是什么意思?也许是时候为您的不同问题寻找现有答案了。如果一切都失败了,你可以提出一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多