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 :

Lecture de sockets client/serveur.


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut Lecture de sockets client/serveur.
    Bonjour à tous.

    Dans le cadre d'un travail de L3 à l'IUT d'Orsay, je dois créer un petit programme de réseau udp sous Linux. Le principe est simple : on utilise des sockets, y'a un client et un serveur, et on doit faire en sorte à ce que le message du client se retrouve dans le serveur. Rien de bien compliqué.

    Seulement voilà. Mon serveur est fait, mon client est fait. Les deux compilent sans problème, mais y'a juste pas moyen de faire en sorte à ce que le message de mon client passe dans le terminal du serveur. La fonction sendto() semble refuser de marcher : je me prends mon vilain "echec sendto" en pleine face à chaque fois. Pourtant je n'ai juste aucun warnings dans la compilation de mon client.

    Jetez donc un oeil au code :

    client_udp.c
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
     
    #include <string.h>
     
    #define SIZE 100
    #define PORT 9600
     
    int main(int argc, char * argv[])
    {
        struct hostent * hostname;
        struct sockaddr_in addrServ = {0};
     
        int s ;
        if ((s= socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
            fprintf(stderr, "Erreur de socket\n");
            return -1;
        }
     
     
     
        if ((hostname = gethostbyname("localhost")) == NULL)
        {
    	fprintf(stderr, "Host inconnu\n");
    	return -1;
        }
        addrServ.sin_family = AF_INET;
        addrServ.sin_port = htons(PORT);
        addrServ.sin_addr = *(struct in_addr *) hostname->h_addr;
        //bcopy(hostname->h_addr, addrServ.sin_addr.s_addr, hostname->h_length);
     
        char buff[SIZE];
        int n;
        n = sprintf(buff, "Je suis un ananas !\n");
        printf("%s", buff);
        if (sendto(s, buff, strlen(buff), 0, (struct sockaddr *)&hostname, sizeof(hostname)) < 0 );
        {
         	fprintf(stderr, "Echec sendto\n");
            return -1;
        }
     
        close(s);
        return 0;
    }
    serveur_udp.c
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
     
    #include <string.h>
     
    #define PORT 9600
     
    int main(int argc, char * argv[])
    {
        struct in_addr inad;
        inad.s_addr = htonl(0x7F000001);
     
        struct sockaddr_in addrServ = {0};
        addrServ.sin_family = AF_INET;
        addrServ.sin_port = htons(PORT);
        addrServ.sin_addr = inad;
     
        struct in_addr inad2;
        inad2.s_addr = INADDR_ANY;
     
        struct sockaddr_in addrCli = {0};
        addrCli.sin_family = AF_INET;
        addrCli.sin_port = htons(PORT);
        addrCli.sin_addr = inad2;
     
        int s ;
        if ((s= socket(PF_INET, SOCK_DGRAM, 0)) < 0)
        {
            fprintf(stderr, "Erreur de socket\n");
            return -1;
        }
     
        //printf("IP = %s, Port = %u\n", addrServ.sin_addr, addrServ.sin_port);
     
        if (bind(s, (struct sockaddr *) &addrServ, sizeof(struct sockaddr_in)) < 0)
        {
            close(s);
            perror("Erreur bind\n");
            return -1;
        }
     
        char buff[100];
        while(1)
        {
            if (recvfrom(s, buff, sizeof(buff), 0, (struct sockaddr *) &addrCli, (socklen_t *) sizeof(addrCli)) != NULL)
            {
     
                write(s, buff, sizeof(buff));
    	    printf("Oui client, vous etes un ananas.\n");
     
                close(s);
            }
        }
     
        return 0;
    }
    Bref. Y'a pas moyen : mon serveur refuse de croire que mon client est un ananas...

    Un peu d'aide s'il vous plait ? :p

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    J'ai essayé de compiler le client et il y a bien des warnings … :
    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
    $ gcc -Wall -Wextra -g -o client client.c 
    client.c: In function ‘main’:
    client.c:42:95: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
         if (sendto(s, buff, strlen(buff), 0, (struct sockaddr *)&hostname, sizeof(hostname)) < 0 );
                                                                                                   ^
    client.c:39:9: warning: variable ‘n’ set but not used [-Wunused-but-set-variable]
         int n;
             ^
    client.c:17:24: warning: variable ‘addrServ’ set but not used [-Wunused-but-set-variable]
         struct sockaddr_in addrServ = {0};
                            ^
    client.c:14:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
     int main(int argc, char * argv[])
                  ^
    client.c:14:27: warning: unused parameter ‘argv’ [-Wunused-parameter]
     int main(int argc, char * argv[])
    Le premier me semble important … un if sans corps est généralement le signe d'une erreur.
    Si tu utilises gcc comme compilateur ajoute toujours les option -Wall et -Wextra … toujours.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par picodev Voir le message
    Bonjour,

    J'ai essayé de compiler le client et il y a bien des warnings … :
    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
    $ gcc -Wall -Wextra -g -o client client.c 
    client.c: In function ‘main’:
    client.c:42:95: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
         if (sendto(s, buff, strlen(buff), 0, (struct sockaddr *)&hostname, sizeof(hostname)) < 0 );
                                                                                                   ^
    client.c:39:9: warning: variable ‘n’ set but not used [-Wunused-but-set-variable]
         int n;
             ^
    client.c:17:24: warning: variable ‘addrServ’ set but not used [-Wunused-but-set-variable]
         struct sockaddr_in addrServ = {0};
                            ^
    client.c:14:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
     int main(int argc, char * argv[])
                  ^
    client.c:14:27: warning: unused parameter ‘argv’ [-Wunused-parameter]
     int main(int argc, char * argv[])
    Le premier me semble important … un if sans corps est généralement le signe d'une erreur.
    Si tu utilises gcc comme compilateur ajoute toujours les option -Wall et -Wextra … toujours.
    Comment j'ai fais pour louper un truc pareil moi ?

    Bon, j'ai corrigé ce fameux ";" devant le if. J'ai également une erreur me disant que addrServ dans le client n'est pas utilisé, ce qui me parait être la source d'erreur.

    Et en effet, ça venait bien de là ! J'utilisait hostname pour le sendto() alors que je devais utiliser addrServ.

    Maintenant mon serveur marche correctement ! Merci beaucoup pour le truc des arguments -Wall et -Wextra.

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

Discussions similaires

  1. Socket client serveur
    Par ppphil dans le forum C#
    Réponses: 1
    Dernier message: 08/09/2007, 10h57
  2. [C] Probleme avec socket client-serveur TCP
    Par LinuxUser dans le forum Réseau
    Réponses: 33
    Dernier message: 15/05/2007, 22h26
  3. [socket] client/serveur multi-thred
    Par iag_1980 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 03/03/2007, 15h38
  4. socket client serveur
    Par idino dans le forum Réseau
    Réponses: 3
    Dernier message: 29/01/2007, 14h45
  5. Socket client serveur
    Par rhdjml dans le forum Langage
    Réponses: 2
    Dernier message: 08/03/2006, 12h09

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