c++ - 使用 SSL 的 boost::asio - SSL 错误后的问题

标签 c++ boost openssl boost-asio

我在我的应用程序中使用同步 boost::asio SSL 套接字。我初始化所有参数,然后连接到一些主机(一个接一个)并对每个主机执行 GET 请求。

一切正常,直到我收到其中一台主机的“404 - 未找到”错误。发生此错误后,所有新连接都会因某些未指定的 SSL 错误而失败。

我必须以某种方式重置 ssl::stream 吗?是否可以在每次连接后重新初始化 ssl::stream?

在下面的代码片段中,我删除了错误处理和所有与 asio 无关的东西。

主要:

asio::io_service ioservice;
asio::ssl::context ctx(ioservice, asio::ssl::context::sslv23);
ctx.set_verify_mode(asio::ssl::context::verify_none);

Connector *con = new Connector(ioservice, ctx);

while (!iplist.empty())
{
    ...
    con->ssl_connect(ipaddress, port);
    ...
}

连接器:

Connector::Connector(asio::io_service& io_service, asio::ssl::context &ctx) 
    : sslSock(io_service, ctx)
{
}

Connector::ssl_connect(std::string ipAdr, std::string port)
{
    ...
    tcp::resolver resolver(ioserv);
    tcp::resolver::query query(ipAdr, port);
    endpoint_iterator = resolver.resolve(query);
    ...

    asio::error_code errorcode = asio::error::host_not_found;
    tcp::resolver::iterator end;

    // Establish connection
    while (errorcode && endpoint_iterator != end)
    {
        sslSock.lowest_layer().close();
        sslSock.lowest_layer().connect(*endpoint_iterator++, errorcode);
    }
    sslSock.handshake(asio::ssl::stream_base::client, errorcode);
    ...
    asio::write(...);
    ...
    asio::read(...);
    ...
    sslSock.lowest_layer().close();
    ...
    return;
}

最佳答案

我从 asio 邮件列表中得到了答案(非常感谢 Marsh Ray)。 Sam Miller 是正确的,因为每次都必须创建 asio::ssl::context。为此,使用了 std::auto_ptr

连接器.h:

std::auto_ptr<asio::ssl::stream<tcp::socket>> sslSock;

连接器.cpp:

asio::ssl::context ctx(ioserv, asio::ssl::context::sslv23);
ctx.set_verify_mode(asio::ssl::context::verify_none);
sslSock.reset(new asio::ssl::stream<tcp::socket>(ioserv, ctx));

关于c++ - 使用 SSL 的 boost::asio - SSL 错误后的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4119589/

相关文章:

c++ - 当模板类型的行为相同时,定义模板化类的成员函数的正确方法是什么?

c++ - Boost 对 fsync() 有影响吗?

Linux CentOS YUM 错误包需要 - libcrypto.so.10(OPENSSL_1.0.1_EC)(64位)

c++ - 提高 tesseract ocr 结果的质量

c++ - boost + 自制软件 + macOS Sierra

c++ - 可以更改模板参数吗?

c++ - 程序在每次运行时生成相同的随机数?

c++ - Qt 是否有与 Boost 的分配模块等效的东西?

objective-c - 在 objective-c 中使用公共(public) pem 进行 OpenSSL 加密

Tomcat:端口 8443 上的 SSL https 连接出现问题