IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Asio : problèmes de socket fermé


Sujet :

Boost C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 132
    Points : 89
    Points
    89
    Par défaut Asio : problèmes de socket fermé
    Bonjour.
    J'ai un petit soucis avec les sockets TCP de Asio. J'établis la connexion, transmet des paquets, tout ça sans le moindre problème. Les difficultés arrivent quand un client déconnecte de manière non propre (il plante, perte de la ligne, ...). En effet, je ne parviens pas à vérifier si le client à qui je transmets des données (socket->send(asio::buffer)) est toujours connecté, ce qui implique une jolie erreur de segmentation si le client est déconnecté. Y a-t-il un moyen de savoir si le client est toujours connecté, ou d'éviter l'erreur de segmentation et d'en profiter pour noter le client comme déconnecté ?

    Merci.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    La callback d'écriture prend en paramètre un 'placeholder' pour l'erreur éventuelle, regarde par exemple l'appel à boost::asio::async_write dans l'exemple chat_session::deliver.
    En cas d'erreur tu peux généralement vaguement considérer que le client est déconnecté et lui fermer sa socket.

    MAT.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 132
    Points : 89
    Points
    89
    Par défaut
    Merci... J'ai des erreurs plutôt étranges, je manque d'expérience avec Asio pour les comprendre :

    /usr/include/asio/impl/write.ipp: In function ‘void asio::async_write(AsyncWriteStream&, const ConstBufferSequence&, CompletionCondition, WriteHandler) [with AsyncWriteStream = asio::basic_stream_socket<asio::ip::tcp, asio::stream_socket_service<asio::ip::tcp> >*, ConstBufferSequence = asio::const_buffers_1, CompletionCondition = asio::detail::transfer_all_t, WriteHandler = boost::_bi::bind_t<void, boost::_mfi::mf1<void, NetworkMachine, const asio::error_code&>, boost::_bi::list2<boost::_bi::value<NetworkMachine*>, boost::arg<1> (*)()> >]’:
    /usr/include/asio/impl/write.ipp:197: instantiated from ‘void asio::async_write(AsyncWriteStream&, const ConstBufferSequence&, WriteHandler) [with AsyncWriteStream = asio::basic_stream_socket<asio::ip::tcp, asio::stream_socket_service<asio::ip::tcp> >*, ConstBufferSequence = asio::const_buffers_1, WriteHandler = boost::_bi::bind_t<void, boost::_mfi::mf1<void, NetworkMachine, const asio::error_code&>, boost::_bi::list2<boost::_bi::value<NetworkMachine*>, boost::arg<1> (*)()> >]’
    CommunicationClients/network_machine.cpp:111: instantiated from here
    /usr/include/asio/impl/write.ipp:186: erreur: request for member ‘async_write_some’ in ‘s’, which is of non-class type ‘asio::basic_stream_socket<asio::ip::tcp, asio::stream_socket_service<asio::ip::tcp> >*’
    Tout à l'heure, mon code qui me faisait segfault :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    try {
    	std::cout << "Sending (TCP) to " << m_tcpSocket->remote_endpoint().address() << " on " << m_tcpSocket->remote_endpoint().port() << " : " << outboundData << std::endl;
    	m_tcpSocket->send(asio::buffer(outboundData));
    } catch(std::exception& e) {
    	std::cerr << "Sending (TCP) on " 
    		<< m_tcpSocket->remote_endpoint().address() << ":" 
    		<< m_tcpSocket->remote_endpoint().port() << " : " 
    		<< e.what() << std::endl;		
    } catch(...) {
    	std::cerr << "Sending (TCP) on " 
    		<< m_tcpSocket->remote_endpoint().address() << ":" 
    		<< m_tcpSocket->remote_endpoint().port() << " : " 
    		<< " unknown exception caught"  
    		<< std::endl;
    }
    Voili voilà, je ne sais pas trop quoi faire de plus...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 132
    Points : 89
    Points
    89
    Par défaut
    Bon ben, résolu avec un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    asio::error_code error;
    m_tcpSocket->write_some(asio::buffer(outboundData), error);
    std::cout << "Write Some errors : " << error << std::endl;
    Merci Mat007 pour la piste

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ASIO] Problème de socket
    Par Raz-X dans le forum Boost
    Réponses: 14
    Dernier message: 04/08/2011, 12h47
  2. Problème avec objet fermé
    Par Mvu dans le forum ASP
    Réponses: 4
    Dernier message: 22/09/2005, 11h30
  3. Réponses: 2
    Dernier message: 26/03/2004, 10h15
  4. [Kylix] Problème de socket
    Par RaygKross dans le forum EDI
    Réponses: 1
    Dernier message: 01/03/2004, 20h41
  5. Mysql ne se lance pas problème de socket
    Par Riko dans le forum Installation
    Réponses: 5
    Dernier message: 05/02/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo