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

Réseau C Discussion :

[C] Probleme avec socket client-serveur TCP


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut [C] Probleme avec socket client-serveur TCP
    Bonjour,

    j'ai réalisé un serveur et un client en mode TCP, les échanges entre les deux (ou plutôt 3 car il y'a 2 clients) ont pour but de jouer au Morpion.

    Mon premier code utilisait la fonction select (cf mon autre topic). Ayant rencontré des difficultés avec cette fonction, j'ai tous recodé, mais cette fois ci je fais 2 accept() dans le serveur au lieu de select.

    Lors de l'exécution, je lance mon serveur ainsi que 2 clients, mais les clients renvoient sur la console "Fin de connexion", ce qui veut dire que aucun des 2 n'a reçu de message et que read( ... ) == 0. Ce qui est faux car mon serveur, leur envoie une invite de saisie...

    je comprends pas où pourrait se situer le problème, alors si quelqu'un pouvait m'aider ça serait sympa.

    Merci .

    EDIT: j'ai remis à jour les PJ

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Mon probleme, n'a pas l'air de passionner les foules

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Sans chercher à savoir ce que fait le code, quelques erreurs dans My_Server.c
    fonction send_msg : fuite de mémoire : malloc sans free
    fonction test_jouer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int test_jouer(char * pInput)
    {
    	int x, y;
    	get_x(pInput,x);
    	get_y(pInput,y);
        return ((x>0 && x<4) && (y>0 && y<4));
    }
    X et y ne sont pas initialisés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int get_x(char * pInput, int pX)  //parse X et Y
    {	
      pX = pInput[6] - '0';
      return pX;
    }
    pX n''a pas à être argument de la fonction : sa valeur initiale n'est pas utilisée
    fonction get_y : idem get_x pour pY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void msg_saisi(int pX, int pY)  //invite de saisie
    {
      printf("\nSaisie case a jouer (X Y) : ");
      scanf("%d %d", &pX, &pY);
    }
    Modifie les variables locales pX et pY (qui sont ensuite détruites) Pas les variables d'appel

  4. #4
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    MErci pour ton aide...

    tu penses que je devrais mettre des pointeurs à la place???

    EDIT: si quelqu'un pouvait m'expliquer ce que Diogene a écrit. Parce que là je comprends pas grand chose.

    Merci.

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par juve1897
    MErci pour ton aide...

    tu penses que je devrais mettre des pointeurs à la place???

    EDIT: si quelqu'un pouvait m'expliquer ce que Diogene a écrit. Parce que là je comprends pas grand chose.

    Merci.
    Pour la fuite de mémoire tu dois faire un free quand tu fais un malloc. Apparemment tu as fais un malloc mais pas de free.

    Pour la 2ème truc tu appeles ta fonction get_x et dans cette fonction tu retournes un int que tu ne recuperes pas. A mon avis tu voulais plutôt faire un truc de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void get_x(char * pInput, int *pX) //parse X et Y
    { 
        pX = pInput[6] - '0';
    }
    Avec un appel comme ça


  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Bonjour à tous,

    je tente de decortiquer petit à petit mon programme et j'ai une petite question:

    lorsque j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int cpt_jouer(char * pTab)  //compte le nombre de coup joués dans la partie
    {
      int i;
      int cpt=9;
     
      for (i=0;i<9;i++) //on soustrait au nombre total de case, le nombre de cases vides
        if (pTab[i]=='-')
          cpt--;
     
      return cpt;
    }
    est ce que la variable "cpt" existe toujours, après l'appel de la fonction???

    Si ce n'est pas le cas est ce qu'il serait possible d'avoir une petite explication...

    Merci d'avance

  7. #7
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    j'ai trouvé quelques erreurs,

    tout d'abord, lorsque je faisais de write() ou read(), je ne mettais pas une taille assez grande pour le 3em argument.

    Et deuxieme erreur, dans la fonction my_client j'ecrivais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        sprintf(pData, "JOUER %d %d\n\r\0", &x, &y);
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        sprintf(pData, "JOUER %d %d\n\r\0", x, y);
    MAis mon morpion ne marche toujours pas...

    Donc si quelqu'un détecte d'autres âneries que j'ai pu écrire, qu'il me fasse signe.

    Merci

  8. #8
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par juve1897
    est ce que la variable "cpt" existe toujours, après l'appel de la fonction???

    Si ce n'est pas le cas est ce qu'il serait possible d'avoir une petite explication...

    Merci d'avance
    Comment ça existe toujours ?

    Tu veux dire si tu rerentres dans la fonction est-ce que la valeur est la même qu'à la dernière sortie ?

    Ou bien est-ce à propos de la valeur retournée ?

  9. #9
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Bonjour,

    je voulais savoir, s'il n'y aurait pas une personne sur le forum qui puisse m'aider.

    Car mon projet est à rendre pour la fin de la semaine, et pour ceux qui ont suivit mes posts depuis le debut savent que je planche dessus depuis plus d'un mois...

    Donc je ne demande aucunement, de faire mon projet à ma place, mais simplement de m'aider à trouver ce qui ne va pas dans mon programme.

    C'est un appel de detresse que je lance...

    Merci à tous ceux qui voudront bien m'aider, car seul je n'y arriverai jamais.

    De plus il serait vraiment dommage que je me ramasse une mauvaise juste à cause d'un detail que je ne vois pas.

    Merci

    PS: le truc qui ne fonctionne pas bien, c'est que le client a toujours un message de retard ...


    Algo:
    Serveur:
    • envoie une invite au client avec l'etat du jeu
    • receptionne les coordonnées envoyées par le premier cleint
    • test si les coordonnées sont bonnes (case vide, si le joueur gagne...)
    • si c'est ok, il envoie au client OK et l'etat du jeu
    • sinon il renvoie INVALIDE et l'eat du jeu
    • Si le compteur de tour arrive à 8 et qu'il n'y a pas de gagnant il envoie NUL et etat du jeu au 2 joueurs


    Client:
    • reception (OK ou INVALIDE) + l'etat du jeu
    • envoie les coordonnées avec l'entete JOUER
    • et il boucle dessus, jusque reception du message de victoire ou de nul


    Voila en gros mon programme

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void traiterClient(Joueur j, char * pMorpion)
    {
      char *pData=malloc(sizeof(char)*1024);
      char buf[1024];//=malloc(sizeof(char)*1024);
      int x, y, rval;
     
      do
      {
        bzero(buf, sizeof(buf));
        bzero(pData,sizeof(pData));
    La dernière ligne ne remet le buffer pData à zéro : sizeof(pData) = taille d'un pointeur (typiquement 4), pas la taille du tableau pointé

  11. #11
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    MErci pour ton aide.
    Meme si je dois avoué que je n'ai pas trop compris le probleme qui est engendré par cette erreur...


    j'ai aussi capté une erreur, j'envoie deux fois le message "MSG + etat du jeu " au client alors que je devrais le faire qu'une fois...

    je sens que je m'approche petit à petit du but...

    PS: j'ai actualisé les codes donnés.

  12. #12
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Autre chose, est ce que quelqu'un aurait une idée de comment coder, une fonction qui demande au le joueur gagnant si il souhaite refaire une partie, si il dit oui on recommence...

    j'avais pensé à faire un genre de

    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
     
    sprintf(pData,"Voulez vous jouer une nouvelle partie ??? O/N \n");
    write(j.sock,pData,1024);
    read(j.sock,buf,1024);
    oui=strcmp("O",buf);
    non=strcmp("N",buf);
     
    while(oui!=0 || non !=0)
    {
      write(j.sock,pData,1024);
      read(j.sock,buf,1024);
      oui=strcmp("O",buf);
      non=strcmp("N",buf);
     
    }
    if(oui==0)
    {
      //recommencer le jeu
    }
    else
    {
      //quitter le jeu
    }
    le hic c'est que je vois pas trop comment je pourrais coder le "recommencer jeu" et le "quitter jeu"...

  13. #13
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    A mon avis avant de rajouter des fonctionnalités, tu devrais plutôt faire en sorte que les actuelles fonctionnent (ce n'est pas méchant hein).


  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    pour quitter, c'est facile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( oui )
      exit (EXIT_SUCCESS);
    Maintenant pour le recommencer, il faudrait inclure tout ton code jusquelà y compris dans un

    initialisé à oui=0.

    Et du coup tu n'as plus besoin du exit...

    A la sortie du while tu es à la sortie du main..

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

Discussions similaires

  1. Probleme avec un Client Serveur de fichier
    Par kertimanoff dans le forum Général Java
    Réponses: 11
    Dernier message: 10/12/2009, 16h45
  2. [Reseau] probleme client/serveur TCP LInux
    Par jmjmjm dans le forum Réseau
    Réponses: 20
    Dernier message: 03/12/2006, 19h32
  3. Réponses: 1
    Dernier message: 11/05/2006, 11h46
  4. Socket client serveur
    Par rhdjml dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2006, 12h09
  5. client/serveur tcp/ip en c sous unix
    Par oclone dans le forum Développement
    Réponses: 8
    Dernier message: 19/04/2005, 18h55

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