boost :: asio с SSL - проблемы после ошибки SSL - PullRequest
3 голосов
/ 07 ноября 2010

Я использую SSL-сокеты синхронного boost :: asio в своем приложении. Я инициализирую все параметры, а затем подключаюсь к некоторым хостам (один за другим) и выполняю запрос GET для каждого хоста.

Все работает, пока я не получу ошибку "404 - Not Found" для одного из хостов. После этой ошибки все новые подключения завершаются с некоторой неопределенной ошибкой SSL.

Должен ли я как-то сбросить поток ssl :: stream? Можно ли заново инициализировать ssl :: stream после каждого соединения?

В следующих фрагментах кода я удалил обработку ошибок и все не связанные с asio вещи.

Main:

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;
}

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

Я получил ответ из списка рассылки asio (большое спасибо Marsh Ray).Сэм Миллер был прав в том, что 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));
3 голосов
/ 09 ноября 2010

вы можете попытаться воссоздать asio::ssl::context каждый раз, когда создаете asio::ssl::stream.

0 голосов
/ 08 августа 2016

Я видел то же исключение, потому что я запускал curl_global_cleanup(); до того, как закончил с curl в приложении.

...