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 :

Socket (read / write)


Sujet :

Réseau C

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut Socket (read / write)
    Bonsoir

    Voilà j'ai fait un programme qui consiste en 1 serveur qui recoit un mot à traduire de la part d'un client.

    voilà le programme côté 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <unistd.h>
     
    #define PORT 9000
    #define TAILLE_QUEUE 1
    #define TAILLE_TAMPON 100
     
    void serveurTcp(int st)
    {
       int longueurMessageRecu;
       char mot[TAILLE_TAMPON];
     
       if ((longueurMessageRecu = read(st, mot, TAILLE_TAMPON)) == -1)
       {
          printf("Erreur fonction read()\n");
          exit(EXIT_FAILURE);
       }
     
       mot[longueurMessageRecu] = '\0';
       printf("Longueur message recu : %d\n", longueurMessageRecu);
       printf("Reception d'une demande de traduction pour le mot : %s\n", mot);
    }
     
    int main(int argc, char *argv[])
    {
       int socketConnection;
       int socketTransfert;
       socklen_t longueurAdresseClient;
       struct sockaddr_in adresseServeur;
       struct sockaddr_in adresseClient;
     
       if ((socketConnection = socket(AF_INET, SOCK_STREAM, 0)) == -1)
       {
          printf("Erreur fonction socket()\n");
          exit(EXIT_FAILURE);
       }
     
       bzero((char *) &adresseServeur, sizeof(adresseServeur));
       adresseServeur.sin_family = AF_INET;
       adresseServeur.sin_port = htons(PORT);
       adresseServeur.sin_addr.s_addr = INADDR_ANY;
     
       if (bind(socketConnection, (struct sockaddr *)&adresseServeur,
                sizeof(adresseServeur)) == -1)
       {
          printf("Erreur fonction bind()\n");
          exit(EXIT_FAILURE);
       }
     
       if (listen(socketConnection, TAILLE_QUEUE) == -1)
       {
          printf("Erreur fonction listen()\n");
       }
     
       printf("********** ATTENTE DE DEMANDE DE CONNECTION **********\n\n");
     
       longueurAdresseClient = sizeof(adresseClient);
       if ((socketTransfert = accept(socketConnection,
                                        (struct sockaddr *)&adresseClient,
                                        &longueurAdresseClient)) == -1)
       {
          printf("Erreur fonction accept()\n");
          exit(EXIT_FAILURE);
       }
     
       printf("********** CONNECTION ETABLIE AVEC LE CLIENT **********\n\n");
       serveurTcp(socketTransfert);
       close(socketConnection);
     
       return EXIT_SUCCESS;
    }

    et voici le programme côté 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
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <unistd.h>
    #include <arpa/inet.h>
     
    char ip[16];
    char strPort[6];
    int port;
     
    void clientTcp(int sc, char *mot)
    {
       int longueurMessageEnvoye;
     
       if ((longueurMessageEnvoye = write(sc, mot, strlen(mot)) == -1))
       {
          printf("Erreur fonction write()\n");
          exit(EXIT_FAILURE);
       }
     
       printf ("Longueur message envoye : %d.\n", longueurMessageEnvoye);
       printf("Demande de traduction effectuee pour le mot : %s.\n", mot);
    }
     
    void decoupeIpPort(char *ipEtPort)
    {
       char strToParse[22];
     
       strcpy(strToParse, ipEtPort);
     
       strcpy(ip, strtok(strToParse, ":"));
       strcpy(strPort, strtok(NULL, ":"));
     
       port = atoi(strPort);
    }
     
    int main(int argc, char *argv[])
    {
       int socketClient;
       struct hostent *he;
       struct sockaddr_in adresseServeur;
       struct in_addr addresseTmp;
     
       decoupeIpPort(argv[1]);
     
       if ((socketClient = socket(AF_INET, SOCK_STREAM, 0)) == -1)
       {
          printf ("Erreur fonction socket()\n");
          exit(EXIT_FAILURE);
       }
     
       bzero((char *) &adresseServeur, sizeof(adresseServeur));
       adresseServeur.sin_family = AF_INET;
       adresseServeur.sin_port = htons(port);
     
       inet_aton(ip, &addresseTmp);
       if ((he = gethostbyaddr(&addresseTmp, sizeof addresseTmp, AF_INET)) == NULL)
       {
          printf("Erreur fonction gethostbyaddr.\n");
          exit(EXIT_FAILURE);
       }
       adresseServeur.sin_addr = *((struct in_addr *)he->h_addr);
     
       if ((connect(socketClient, (struct sockaddr *)&adresseServeur,
                    sizeof(adresseServeur)) == -1))
       {
          printf("Erreur fonction connect()\n");
          exit(EXIT_FAILURE);
       }
     
       printf("********** CONNECTION ETABLIE AVEC LE SERVEUR **********\n\n");
     
       clientTcp(socketClient, argv[2]);
     
       close(socketClient);
     
       return EXIT_SUCCESS;
    }
    Le souci c'est qu'à l'exécution sur le client, la longueur du message envoye est de 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    exhortae@exhortae-desktop:~/ex1/tcpClient$ ./a.out 192.168.1.33:9000 developpez.com
    ********** CONNECTION ETABLIE AVEC LE SERVEUR **********
     
    Longueur message envoye : 0.
    Demande de traduction effectuee pour le mot : developpez.com.
    exhortae@exhortae-desktop:~/ex1/tcpClient$
    pourtant le serveur recoit bien un message de longueur 14 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exhortae@exhortae-desktop:~/ex1/tcpServeur$ ./a.out
    ********** ATTENTE DE DEMANDE DE CONNECTION **********
     
    ********** CONNECTION ETABLIE AVEC LE CLIENT **********
     
    Longueur message recu : 14
    Reception d'une demande de traduction pour le mot : developpez.com
    exhortae@exhortae-desktop:~/ex1/tcpServeur$

    j'ai cherché partout mais je comprends pas ou est le problème.

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    bon déjà ton programme ne gère pas du tout le cas où l'utilisateur entre n'importe quoi, mais ça c'est un autre problème...

    Pour répondre à ton unique question je dirais que ta parenthèse est mal placée :
    if ((longueurMessageEnvoye = write(sc, mot, strlen(mot)) == -1))

    devient:
    if ((longueurMessageEnvoye = write(sc, mot, strlen(mot))) == -1)

    Cordialement

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Bonsoir,

    Citation Envoyé par joux__ Voir le message
    Bonsoir,

    bon déjà ton programme ne gère pas du tout le cas où l'utilisateur entre n'importe quoi, mais ça c'est un autre problème...
    Oui je me concentrait juste sur les sockets dans cet exercise

    Citation Envoyé par joux__ Voir le message
    Pour répondre à ton unique question je dirais que ta parenthèse est mal placée :
    if ((longueurMessageEnvoye = write(sc, mot, strlen(mot)) == -1))

    devient:
    if ((longueurMessageEnvoye = write(sc, mot, strlen(mot))) == -1)

    Cordialement
    Merci, j'aurais pas trouvé sans m'être arraché la moitié des cheveux

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par exhortae Voir le message
    Merci, j'aurais pas trouvé sans m'être arraché la moitié des cheveux
    Il faut dire aussi que rien ne t'oblige à écrire du code illisible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    longueurMessageEnvoye = send(sc, mot, strlen(mot), 0);
     
    if (longueurMessageEnvoye == SOCKET_ERROR)
    ça le fait... Attention aussi à traiter le cas de longueurMessageEnvoye == 0 qui signifie 'deconnexion'.

    http://emmanuel-delahaye.developpez.com/reseaux.htm
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    juste pour pinailler ...

    CONFORMITÉ BZERO
    BSD 4.3. Cette fonction est déconseillée (marquée comme historique dans
    POSIX.1-2001), utilisez plutôt memset(3).
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par yakamoneye Voir le message
    juste pour pinailler ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct sockaddr_in adresseServeur = {0};
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct sockaddr_in adresseServeur = {0};
    aussi oui ...
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

  8. #8
    Membre régulier Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Points : 122
    Points
    122
    Par défaut
    celle ci juste pour le fun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( inet_aton(ip, &addresseTmp) == 0 )
    {
      perror( "adresse invalide ...");
      exit( EXIT_FAILURE );
    }
    Pourquoi les pierres carrées font elles des ronds dans l'eau ?

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

Discussions similaires

  1. Read Write socket
    Par chercheur111 dans le forum Développement
    Réponses: 0
    Dernier message: 29/06/2012, 18h33
  2. probleme read write serveur/client
    Par romainromain dans le forum Réseau
    Réponses: 9
    Dernier message: 22/11/2006, 16h23
  3. propriété read write
    Par new_wave dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/09/2006, 11h24
  4. Problème socket : le write ne se fait qu'au moment du close
    Par Synn dans le forum Développement
    Réponses: 6
    Dernier message: 23/05/2006, 15h16
  5. Problème de read/write
    Par mylooz dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2005, 19h15

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