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 :

réception des messages dans un chat en tcp


Sujet :

Réseau C

  1. #1
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut réception des messages dans un chat en tcp
    Bonjour,

    j'ai écirs un chat, mais il me reste un problème côté client.

    qd un des clients ecris qch, les autres ne le reçoivent qu' après qu'ils aient écris qch également.

    au début, je lisais en fgets, donc cela me semblait logique, maintenant, j' utilise select,
    mais j'ai tjs le même problème.

    voici mon client:

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    
    
    
    #define NPORT 9999
    
    
    int main(int argc, char * argv[])
    {
    
           int sock;
           struct sockaddr_in serveur_adr;
           struct hostent *machine;
        int length;
    
        fd_set master;
        
        FD_ZERO(&master);
    
        FD_SET(STDIN_FILENO,&master);
    
        int c;
        int rval,rtval;
    
        char *a;
        a=malloc(sizeof(char)*1024);
        char b[1033];
        /*char *surnom;
        char *PORT;*/
        
        scanf("%s",a);
    
        if(strncmp(a,"/connect",8)==0)
        {
                
        
            
            //creation socket modele TCP AF_INET
            
            sock = socket (AF_INET, SOCK_STREAM, 0);
            if (sock < 0)
            {
                perror("socket");
                return 1;
            }
            
            //preparation adresse destination
            
            bzero (&serveur_adr, sizeof(serveur_adr));
            serveur_adr.sin_family          = AF_INET;
            serveur_adr.sin_port            = htons(NPORT);
            serveur_adr.sin_addr.s_addr     = inet_addr ("127.0.0.1");
            
            //connection distante
        
            if (connect(sock, (struct sockaddr *)&serveur_adr, sizeof(serveur_adr)) < 0)
            {
                perror ("connect");
                close (sock);
                return 1;
            }
            while(1)
            {
    
                    a=malloc(sizeof(char)*1024);
                    if (select(1, &master, NULL, NULL, NULL) == -1) 
                    {    
                        perror("select");
                        exit(1);
                    }
                    if(FD_ISSET(0,&master))      //si select n'a rien détecté, fd_isset -> faux,donc pas de read sur stdin
                    {
                        if(read(0,a,1024)>0)
                        {
                            if (write(sock,a,1024) < 0)
                            {
                                perror ("write");
                                close(sock);
                                return 1;
                            }
                        }
                    }
        
                    
                    //ferme le client si "/quit" est tape
                    if(strncmp(a,"/quit",5)==0)
                    {
                        close(sock);
                        exit(0);
                    }
                               /*tandis que read est toujours pris en compte*/
    
                     if((rval = read (sock,b,sizeof(b))) < 0)
                    {
                        perror("read");
                    }
                    if(rval==0)
                        fprintf(stderr, "!!!!!!!!probleme!!!!!!\n");
                    if(strncmp(b,"/shutdown",9)==0)
                    {
                        close(sock);
                        fprintf(stdout,"le serveur a ete fermee\n");
                        return 0;
                    }
                    else            
                        fprintf(stdout,"%s\n",b);            
    
            }
            close (sock);
         }
               return 0;
    
    }
    Si quelqu'un pouvait m' expliquer pourquoi, ça serait vraiment sympa.

    Merci d'avance,

    Jerome
    Wer nicht probiert, verliert !!

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    tu n'as pas ajouté le socket au FD_SET ... c'est normal?
    de plus tu dois conserver une copie de ton FD_SET, select l'altere, tu dois le remettre aux bonnes valeurs en debut de ta boucle while.

    il y'as des choses qui me chagrinent dans ton code:
    bzero est deprecié: voir memset.
    malloc peux echouer: il faut tester son retour.
    il ne faut pas confondre Address Family et Packet Family: sock = socket (PF_INET, SOCK_STREAM, 0);
    scanf("%s" <= toi tu cherche les ennuis .

    ta boucle while ... euh? comment dire ... revois ton algorithme
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    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
    Juste une question, c'est toi qui a colorié ton code? Si oui je te dis bravo, c'est vraiment très beau et très lisible.
    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]

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     read(0,a,sizeof(a)*1024)
    Ton "read" me me parait douteux au niveau du sizeof. Je pense plutôt que tu voulais faire un sizeof(*a).
    Tu veux vraiment écrire 1Ko dans ta socket ? La longueur de la chaine pointée par "a" serait plus judicieux.

    Sinon y a pas mal de chose a revoir dans la conception.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #5
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    je n'ajoute pas la socket au fd_set car mon client se connecte à un seul serveur.
    j'utilise exclusivement select pour gérer l'entrée standard.

    je ne savais pas que select altère le fd_set, merci

    bzero et socket (AF_INET, SOCK_STREAM,0) nous ont été donnés en cours, je vais vérifié la nuance.

    kwrite gére la police dépendant des extensions des fichiers ( .c , .java , .sh, etc))

    pour le read, j'ai envie de lire (au plus)1024 caractères sur l'entrée standard, jpense que mon code est correct, sinon peux-tu m'expliquer stp ?

    pour le write, t'as raison, il est bien mieux de donner la longuer de la chaîne pour la taille puisque il ne peut y avoir plus dans le buffer.

    Comment gérer le fait qu'il faut qu'un client tape sur entrée pour qu'il reçoive le message d'un autre client ?
    Je pensais que comme ci-dessus, mon client devrait tout de suite écrire ce qu'il reçoit sur la sortie standard.
    Ouel qu'un voit -il où est l'erreur ?

    Merci pour ces réponses
    Wer nicht probiert, verliert !!

  6. #6
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par je®ome
    pour le read, j'ai envie de lire (au plus)1024 caractères sur l'entrée standard, jpense que mon code est correct, sinon peux-tu m'expliquer stp ?
    "a" étant un pointeur, sizeof(a) = 4. Ce n'est pas ce que tu veux ?
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  7. #7
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    crocodilex a écrit Citation:
    je®ome a écrit :
    pour le read, j'ai envie de lire (au plus)1024 caractères sur l'entrée standard, jpense que mon code est correct, sinon peux-tu m'expliquer stp ?


    "a" étant un pointeur, sizeof(a) = 4. Ce n'est pas ce que tu veux ?
    T'as raison, je n'avais pas bien vérifié, merci
    Wer nicht probiert, verliert !!

  8. #8
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par je®ome
    Bonjour,
    j'ai écirs un chat, mais il me reste un problème côté client.
    qd un des clients ecris qch, les autres ne le reçoivent qu' après qu'ils aient écris qch également.
    Citation Envoyé par je®ome
    je n'ajoute pas la socket au fd_set car mon client se connecte à un seul serveur.
    j'utilise exclusivement select pour gérer l'entrée standard.
    D'où ton problème. Dark_Ebola a raison, tu dois ajouté la socket au FD_SET.
    Etant donné que ton select est bloquant, il ne se passe rien tant que le client n'a rien a envoyé.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  9. #9
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    excuse - moi Dark Ebola,tu avais raison, faut que j'ajoute la socket au fd_set également.
    enfin, ça marche.

    Merci de votre aide
    Wer nicht probiert, verliert !!

  10. #10
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Citation Envoyé par Skyrunner
    Juste une question, c'est toi qui a colorié ton code? Si oui je te dis bravo, c'est vraiment très beau et très lisible.
    salut,
    çà serait bien si les administrateurs du forum ajoutaient une fonctionalité pour colorier automatiquement les sources postées en [ code][ /code] ^^
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. [OL-2003] Erreur dans la réception des messages
    Par vlksoft dans le forum Outlook
    Réponses: 0
    Dernier message: 13/01/2010, 12h15
  2. Réception des messages dans le Socket
    Par rzayani dans le forum C++
    Réponses: 3
    Dernier message: 16/04/2008, 10h33
  3. Modification des YES en Oui et des messages dans dlg
    Par netchip dans le forum Langage
    Réponses: 11
    Dernier message: 15/04/2006, 14h31
  4. réception des messages WM_PAINT
    Par enzoMetz dans le forum Windows
    Réponses: 2
    Dernier message: 19/06/2004, 20h15

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