簡體   English   中英

使用SSL的boost :: asio - SSL錯誤后的問題

[英]boost::asio with SSL - problems after SSL error

我在我的應用程序中使用同步boost :: asio SSL套接字。 我初始化所有參數然后連接到一些主機(一個接一個)並為每個主機執行GET請求。

一切正常,直到我得到一個主機的“404 - Not Found”錯誤。 發生此錯誤后,所有新連接都會因某些未指定的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

Connector.h:

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

Connector.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));

您可以嘗試在每次創建asio::ssl::stream時重新創建asio::ssl::context

我看到了同樣的異常,因為我運行了curl_global_cleanup(); 在我完成應用程序中的curl之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM