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

C++ Discussion :

Problème avec les sockets


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 6
    Par défaut Problème avec les sockets
    Bonjour, j'ai codé un client et un serveur pour une messagerie instantanée qui fait partie d'un projet que je dois rendre pour mardi, sauf que j'ai l'impression que les deux refusent de marcher ensemble.
    Le client comme le serveur compilent niquel mais ils ne remplissent pas leur fonction on dirait...

    Je lance d'abord le serveur avant le client, mais au lancement du client il est sensé se connecter au serveur et le serveur afficher un message comme quoi la connexion a été acceptée, sauf que ce message ne s'affiche jamais, et les socket envoyées depuis le client ne sont jamais traitées par le serveur...

    Voici les codes en question :

    Boucle de traitement du serveur :

    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
     
    while (true)
    	{
    		std::cout << "OK" << std::endl;
    		sockaddr_in from = {0};
    		int addrlen = sizeof(from);
    		CLIENT newClient(accept(server, (SOCKADDR*)(&from), &addrlen), from);
     
    		std::cout << "Client connecté" << std::endl;
     
    		if (newClient.m_connected) // la socket est connectée
    		{
    			std::thread processing(Process, newClient);
    			processing.detach();
    		}
    	}
    Côté client, un peu + de code :

    La boucle de gestion du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::thread sending(sendMessage, server);
    	std::thread receiving(recvMessage, server);
     
    	sending.detach();
    	receiving.detach();
     
    	while (true)
    	{ }
    Les deux fonctions lancées en threads :

    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
     
    void sendMessage(SOCKET s)
    {
    	while (true)
    	{
    		std::string buff;
    		std::cout << "[Vous] ";
    		std::getline(std::cin, buff);
    		std::cout << std::endl;
     
    		int Bytes = send(s, buff.c_str(), 1024, 0);
    		if (Bytes <= 0)
    		{
    			std::cout << "[ERREUR] Interruption de la connexion avec le serveur" << std::endl;
    			break;
    		}
    	}
    }
    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
     
    void recvMessage(SOCKET s)
    {
    	while (true)
    	{
    		char buffer[1025];
    		int Bytes = recv(s, buffer, 1024, 0);
    		if (Bytes <= 0)
    		{
    			std::cout << "[ERREUR] Interruption de la connexion avec le serveur" << std::endl;
    			break;
    		}
     
    		std::cout << "[Message] " << buffer << std::endl;
    	}
    }
    Merci d'avance pour l'aide que vous pourriez m'apporter !

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Avec juste des morceaux de code qui n'ont pas grand sens, je vois pas trop par quel magie on pourrait t'aider.
    Pour le reste, (re)lis ton cours et tu as aussi un cours disponible dans ma signature. Un code ne refuse pas de marcher, il fonctionne tel que tu l'implémentes.
    Mettre des threads de partout en étant débutant est le meilleur moyen de se planter.
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 14
    Par défaut
    Même si je suis d'accord avec ce qui est dit au dessus je vois immédiatement plusieurs problèmes potentiels avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLIENT newClient(accept(server, (SOCKADDR*)(&from), &addrlen), from);
    form en tant que second argument donné à la fonction est probablement copié, hors il ne faut pas compter sur l'ordre d'évaluation des arguments de fonction, pense à appeler accept avant d'appeler cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Bytes = send(s, buff.c_str(), 1024, 0);
    l'argument len de send est la longueur exacte du message que tu dois transmettre, essaye buff.size() ou buff.size() + 1 plutôt que 1024, pour avoir plus d'informations sur son fonctionnement les pages du manuel sont ton ami (et https://linux.die.net/man/2/send aussi)

Discussions similaires

  1. un serieux problème avec les sockets
    Par dc.sara dans le forum Réseau
    Réponses: 4
    Dernier message: 23/01/2008, 16h11
  2. problèmes avec les sockets
    Par lukbutor dans le forum Réseau
    Réponses: 24
    Dernier message: 23/04/2007, 01h12
  3. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  4. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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