1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut class TCP connexion (server/client) using multithreads

    Bonjour,

    Je suis en train de développer un classe connexion TCP IP (serveur/clients) en utilisant le contexte multithreads, vous trouverez ci-joint les blocs-notes de mon code. Mon problème c'est que lors de l'exécution le serveur est toujours à l'écoute et accepte des nouvelles connexions mais j'arrive pas à envoyer et recevoir des messages entre les deux. Est-ce que Quelqu'un peut m'aide s'il vous plaît!

    Merci d'avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 473
    Points : 38 201
    Points
    38 201

    Par défaut

    Bonjour,
    Il te faut mettre de l'ordre dans tes idées, car tu mélanges deux concepts peux compatibles:
    • Le serveur supportant de multiples connexions simultanées (pas trop non plus, car le serveur-thread, ça ne scale pas des masses en fait)
    • L'interaction entre la console du serveur et un client unique.

    Je te conseille de choisir l'un ou l'autre:
    • Soit ton serveur accepte de multiples clients, et (du moins pour commencer) ces connexions client n'ont aucune interaction entre elles (du genre, un serveur FTP, et non pas un serveur de discussion)
      Plus tard, tu pourras développer de quoi faire communiquer les clients entre eux, vu que ton serveur n'est pas un serveur-fork)
    • Soit tu cherches à faire une conversation avec un client unique et tu fermes le socket d'écoute une fois ce client connecté.

    Cette décision te permettra de résoudre le premier conflit de ton code: Dans le fonctionnement de ton code actuel, serveur::start() ne retourne jamais, donc tout ce qui suit son appel dans le main() ne sert à rien.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Salut,
    Je vous remercie pour vos explications. J'ai déjà crée un serveur qui communique avec un seul client, mais ce que je voulais faire maintenant c'est de développer un serveur qui accepte multiples clients (c'est déjà fait dans la premier partie du code et ça fonctionne) il me manque de faire communiquer les clients.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 473
    Points : 38 201
    Points
    38 201

    Par défaut

    Pas de questions techniques par messages privés, s'il te plait.

    Le plus urgent pour ton code, c'est de séparer en deux ta fonction server::start(), pour que ce soit un vrai "démarrage": tout ce qui se trouve après le cout << "serveur demarre sur le port " << port << endl; doit aller dans une nouvelle fonction à appeler connectionLoop() ou un truc du genre.

    Ensuite, le but du serveur est de servir les clients, de répondre à leurs demandes. Normalement on n'est pas censé interagir avec l'un ni l'autre depuis la console. Mais si tu exécutes connectionLoop() dans un thread séparé, tu peux te servir de la console pour administrer le serveur, et notamment implémenter une commande pour faire running=false; (penser à le déclarer volatile ou atomic) et attendre la fin du thread serveur.

    Côté "connexion au client", pour commencer, faire juste un serveur qui répond aux demandes des clients (pour les premiers tests, un simple "bonjour!" avec une réponse "salut!" suffira). Une fois que tu auras quelque chose qui marche, tu pourras envisager quelque chose de plus complexe (avec possiblement des interactions d'un client à l'autre -- attention à la synchronisation si les clients sont sur différents threads).

    Aussi: Ta gestion d'erreur dans serveur::start() montre que tu penses encore en C. Tu ne devrais avoir qu'un seul closersocket(ListeningSocket), celui du destructeur de la classe serveur. Pareil pour l'appel à WSACleanup(), pour ça tu as intérêt à faire une classe dédiée:
    Code C++11 : 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
    class WinSockInit
    {
    public:
    	WSADATA wsaData;
    	WinSockInit() : wsaData()
    	{
    		int error = WSAStartup(MAKEWORD(2, 0), &wsaData);
    		if(error != 0)
    		{
    			std::ostringstream oss;
    			oss << "Error #" << error << " initializing Windows Sockets";
    			throw std::runtime_error(oss.str());
    		}
    	}
    	~WinSockInit() { WSACleanup(); }
    	WinSockInit(WinSockInit const&) = delete;
    	WinSockInit& operator=(WinSockInit const&) = delete;
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Je te remercie encore une entre fois, et je m'excuse de te contacter en privé.

    Merci.

Discussions similaires

  1. class de connexion sur sql server dans c#
    Par rosymirou dans le forum C#
    Réponses: 0
    Dernier message: 24/02/2014, 14h52
  2. [C/C++]Socket Server/Client
    Par X-K4l1 dans le forum Développement
    Réponses: 5
    Dernier message: 03/12/2013, 12h08
  3. [C++] Probleme de connexion socket client à mon serveur smtp
    Par matthieu5978 dans le forum Développement
    Réponses: 2
    Dernier message: 04/12/2005, 08h19
  4. [infos]connexion applet client+serveur
    Par freums dans le forum Applets
    Réponses: 5
    Dernier message: 25/08/2005, 09h57
  5. [ado][sql server] CLIENT/SERVER
    Par nil dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h12

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