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 :

créer un serveur tcp en mode synchrone


Sujet :

Boost C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut créer un serveur tcp en mode synchrone
    Bonjour,

    voila j'ai créé via la library boost un serveur, et j'arrive a récupérer les informations de mon client. Le probleme est quand je déconnecte mon client du serveur mon code plante. J'aimerai en faite que lorsque je déconnecte mon client du serveur, que mon serveur attende qu'un autre client se connecte mais je n'arrive pas à réaliser cette étape.

    Voici mon code:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // Création du service principal et du résolveur.
        boost::asio::io_service ios;
     
        // Création de l'acceptor avec le port d'écoute 30000 et une adresse quelconque de type IPv4 // (1)
        tcp::acceptor acceptor(ios, tcp::endpoint(tcp::v4(), 30000));
     
        char buffer[256];
     
        // Création d'une socket
        tcp::socket socket(ios); // (3)
     
        while(1){
        	std::cout << "en attente du client..." << std::endl;
        	acceptor.accept(socket); // on attend qu'un client se connect
        	std::cout << "Client connected ! " << std::endl;	
     
        	while (acceptor.is_open())
    	    {
    	    	try{
    	    		boost::asio::read(socket, boost::asio::buffer(buffer));	
    	    	}
    	    	catch(std::exception& e){
     
    	    		std::cout << "client left" << std::endl;
    	    		acceptor.close();
    	    		break;
    	    	}
     
    	        std::string message = buffer;
    	        std::cout << "message recu : " << message << std::endl;
    	    }
        }
    lorsque je déconnecte mon client, j'ai le message d'erreur suivant :
    accept : already open


    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je dis peut-être une connerie n'ayant jamais utilisé boost mais d'après un très rapide coup d'oeil à la doc
    - acceptor est un socket serveur
    - accept prend en paramètre le socket client à initialiser avec la connection acceptée
    du coup acceptor.close ferme le socket serveur et donc détruit le serveur : t'auras du mal à accepter de nouvelles connections derrière.
    Du coup il faudrait fermer le client (socket).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    merci pour ta réponse.

    En enlevant acceptor.close(); j'ai toujours la meme erreur. le serveur affiche bien toutes les informations envoyé par le client, mais des que le client ferme sa socket alors mon serveur me retourne le message d'erreur :
    what() : accept: Already open

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Enlever acceptor.close est une partie du message, l'autre stipule qu'il faut ajouter socket.close. As-tu testé cela ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Créer un petit serveur TCP avec des Sockets ?
    Par UiYuki dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 25/09/2009, 09h31
  2. Créer un client pour serveur TCP/IP
    Par Pierre de Nice dans le forum Débuter
    Réponses: 7
    Dernier message: 26/01/2009, 21h56
  3. client/serveur tcp/ip en c sous unix
    Par oclone dans le forum Développement
    Réponses: 8
    Dernier message: 19/04/2005, 18h55
  4. Serveur TCP/IP Indy bloquant ?
    Par f6dqm1 dans le forum Web & réseau
    Réponses: 6
    Dernier message: 07/12/2004, 09h08
  5. [Concept]Concept d'un serveur TCP/IP
    Par Zc dans le forum Développement
    Réponses: 8
    Dernier message: 17/01/2003, 17h06

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