2010-11-07 5 views
3

J'utilise des sockets synchrones boost :: asio SSL dans mon application. J'initialise tous les paramètres, puis me connecte à certains hôtes (l'un après l'autre) et fais une requête GET pour chaque hôte. Tout fonctionne jusqu'à ce que j'obtienne une erreur "404 - Not Found" pour l'un des hôtes. Après cette erreur, toutes les nouvelles connexions échouent avec une erreur SSL non spécifiée.boost :: asio avec SSL - problèmes après erreur SSL

Dois-je réinitialiser le flux ssl :: en quelque sorte? Est-il possible de réinitialiser le flux ssl :: après chaque connexion?

Dans les extraits de code suivants, j'ai supprimé la gestion des erreurs et toutes les choses non asio liées.

principal:

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

Connecteur:

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

"une erreur SSL non spécifiée" n'est pas une information très utile. OpenSSL fournit de très bons messages d'erreur, si vous voulez les vérifier (par exemple 'ERR_print_errors_fp()'). – caf

+0

@caf - Merci pour l'info. Asio écrit seulement "Erreur SSL". Je vais vérifier si OpenSSL a plus d'infos – mspoerr

+0

@Sam Miller: Oui, j'ai des gestionnaires pour tous les codes de retour et les exceptions. – mspoerr

Répondre

4

J'ai reçu la réponse de la liste de diffusion asio (merci beaucoup à Marsh Ray). Sam Miller a eu raison de dire que le contexte asio :: ssl :: doit être créé à chaque fois. Pour ce faire, std::auto_ptr est utilisé.

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

vous pouvez essayer de recréer le asio::ssl::context chaque fois que vous créez un asio::ssl::stream.

+0

Je ne sais pas comment je peux le faire. Il n'y a pas d'option pour assigner le contexte après la création du socket. – mspoerr

+0

@mspoerr vous instanciez également le socket. –

+0

Ce serait très compliqué, car cela signifie une refonte complète de mon application. Je dois y penser ... – mspoerr

0

J'ai vu la même exception parce que je courais curl_global_cleanup(); avant que je fait avec boucle dans l'application.