2010-11-07 257 views
3

我在我的应用程序中使用了同步boost :: asio SSL套接字。我初始化所有参数,然后连接到一些主机(一个接一个),并为每个主机做一个GET请求。使用SSL的boost :: asio - SSL错误后的问题

一切正常,直到我得到一个“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; 
} 
+0

“某些未指定的SSL错误”不是非常有用的信息。 OpenSSL提供非常好的错误消息,如果你想检查它们(例如''ERR_print_errors_fp()')。 – caf 2010-11-08 14:42:20

+0

@caf - 感谢您的信息。 Asio只写“SSL错误”。我将检查OpenSSL是否有更多的信息 – mspoerr 2010-11-08 22:00:01

+0

@Sam Miller:是的,我有处理所有返回代码和异常的处理程序。 – mspoerr 2010-11-08 22:00:51

回答

4

我从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

,你可以尝试创建一个asio::ssl::streamasio::ssl::context每次重新创建。

+0

我不知道我该如何做到这一点。创建套接字后没有选择分配上下文的选项。 – mspoerr 2010-11-09 18:45:57

+0

@mspoerr你也会实例化套接字。 – 2010-11-09 19:07:35

+0

这会非常复杂,因为它意味着我的应用程序的完全重新设计。我需要考虑一下...... – mspoerr 2010-11-10 21:18:51

0

我看到了同样的异常,因为我跑curl_global_cleanup();我与应用程序中的卷曲之前完成。