2010-11-07 253 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();我與應用程序中的捲曲之前完成。