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

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Mon probleme, n'a pas l'air de passionner les foules

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 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

    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  6. #6
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 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 ?
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par Skyrunner
    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 ?

    Désolé de mettre mal exprimé, je parle bine de la valeur de retour, celle qui est retournée à la fin de la fonction.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par juve1897
    Désolé de mettre mal exprimé, je parle bine de la valeur de retour, celle qui est retournée à la fin de la fonction.
    Ben si tu la récupère il n'y a pas de soucis. Le retour se fait par valeur.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  11. #11
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Ok merci.

    Mais j'ai du mal à comprendre à quel niveau mon programme ne fonctionne pas.

    c.a.d, est ce du point de vu de l'algo ou bien des erreurs de syntaxes (pointeurs, fonction qui ne retourne pas la bonne valeur ...) que ça ne va pas.

    Je vois pas comment debugger mon programme...

    j'ai lu le topic qui est consacré, mais même avec des printf() partout, je vois pas.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je regarderais ton code dès que j'aurais un peu de temps.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  13. #13
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci c'est cool.

    En tous cas moi je continue à traquer les erreurs avec mes petits printf().

  14. #14
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    fprintf (stderr, " toto"); serait mieux ....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par souviron34
    fprintf (stderr, " toto"); serait mieux ....
    ??
    Pourquoi donc ?
    A partir du moment ou il mets bien un \n à la fin je vois pas de problème.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  16. #16
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par souviron34
    fprintf (stderr, " toto"); serait mieux ....
    A quelle ligne j'ai bien pu mettre ça ???

  17. #17
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    je dis juste que pour tracer une erreur mettre fprintf(stderr..) est mieux que mettre printf(..) car stderr est SYNCHRONE..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par souviron34
    je dis juste que pour tracer une erreur mettre fprintf(stderr..) est mieux que mettre printf(..) car stderr est SYNCHRONE..
    Ah ok, merci beaucoup.

    Mais je ne sais pas comment marche cette focntion.

    J'utilise printf() pour suivre l'évolution de certaines de mes variables, voir si elles s' incrémentent bien, si les données envoyées sont les bonnes, ect...

  19. #19
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    man fprintf .. ou voir les cours ou tutoriels ici-même..

    fprintf ( stderr, ... )

    les ... sont à remplacer par la même chose que ce que tu mets dans le printf..

    c'est juste que printf est bufferisé, donc ça ne garanti pas que l'impression se fasse QUAND tu passes sur l'instruction. Donc tu peux faire un printf ("1") printff ("2"), et tu ne verras pas 1 alors qu'en fait ton programme aura déjà dépassé cette instruction avant de crasher. Alors que stderr est SYNCHRONE donc toute écriture sort immédiatement, et donc la traçabilité est instantanée.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  20. #20
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Merci beaucoup pour ces explications...

    je vais mes documenter un peu sur cette fonction.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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