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 :

exemple simple de sockets qui ne communiquent pas


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut exemple simple de sockets qui ne communiquent pas
    Bonjour à tous,

    J'ai écrit un exemple simple de sockets en 2 fichiers : Server1.c (qui rentre dans une boucle infinie pour écouter les clients) et Client1.c (qui envoie un message simple au serveur).

    Les 2 fichiers sont compilés et s'exécutent mais le processus serveur ne reçoit rien du processus client car il doit normallement afficher la phrase qu'il reçoit du client.

    Les 2 programmes sont lancés sur la même machine.

    Voici le code de Server1.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
    62
    63
    64
    65
    66
    67
    68
     
    /***********************************SERVEUR TCP**********************************/
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<unistd.h>
    #include<stdlib.h>
     
    #define PORTS 2058
     
    main() 
    {
    int namelen, sock, nsock;
    char buf[20];
    struct sockaddr_in adr_s, adr_c;
    int lg, n, pid;
     
    /* Cr�ation socket */
    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     
    /* Attachementsocket */
     
    /**************************************************************************************/
    /*  Server address	*/
    /**************************************************************************************/
    /*construit_adresse_locale (&adr_c, 0); */
     
    adr_s.sin_family = AF_INET; 
    adr_s.sin_addr.s_addr = INADDR_ANY; 
    adr_s.sin_port = PORTS; 
     
    bind(sock, (struct sockaddr*)&adr_s, sizeof(adr_s));
    listen(sock,5);
     
    /*Signal(SIG_CHLD, SIG_IGN);*/
     
    /************************************************************************************/
    /*		Infinite Loop    */
    /************************************************************************************/
    While(1==1) 
     
    { 
    /* Attente de question sur la socket */
    printf("Avant accept\n");
     
    lg= sizeof(adr_c);
    nsock= accept (sock, (struct sockaddr*)&adr_c, &lg);
     
    printf("Apres accept\n");
     
    pid= fork();
     
     
    if (pid== 0) 
     
    {
    close (sock);
    read (nsock, buf, 20);
    printf("%s\n",buf); 
     
    close (nsock);
     
    exit(0);
    }
    }
    }
    Et voici le code de Client1.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
    62
     
    /******************/
    /* Client TCP */
    /******************/
    #include<errno.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<unistd.h>
     
    #define PORTS 2058
     
    main()
    {
     
    struct hostent*h;
    struct sockaddr_in adr_s,adr_c;
    char buf[20];
    int sock;
     
    /* cr�ationsocket */
     
    sock= socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
     
    /* Attachementsocket */
     
    /**************************************************************************************/
    /*  Client address	*/
    /**************************************************************************************/
     
    /*bzero(&adr_c, sizeof(adr_c)); */
    memset(&adr_c, 0x0, sizeof(adr_c));
     
    adr_c.sin_family = AF_INET; 
    adr_c.sin_addr.s_addr = INADDR_ANY; 
    adr_c.sin_port = PORTS; 
     
    /*adresse_ip= INADDR_ANY, port = deuxi�me argument;*/
     
    bind(sock, (struct sockaddr*)&adr_c, sizeof(adr_c));
     
    /* Construction adresse du serveur */
     
    h=gethostbyname("localhost");
     
    /**************************************************************************************/
    /*  Server address	*/
    /**************************************************************************************/
    bzero((char *) &adr_s, sizeof(adr_s)); 
     
    adr_s.sin_family = AF_INET; 
    adr_s.sin_addr.s_addr = *h->h_addr; 
    adr_s.sin_port = PORTS; 
     
    /*adresse_ip= h.addr, port = PORTS*/
     
    connect (sock,(struct sockaddr*)&adr_s, sizeof(adr_s));
    write(sock, "bonjour, serveur!!  ", 20);
    close (sock);
     
    }
    Ai-je oublié quelque chose ?

    Auriez-vous une idée ?

    Merci beaucoup pour votre aide.

    Laurent.

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Tes deux programmes s'attachent au meme port. Enleve l'appel a bind() dans le client, ce n'est pas necessaire pour appeller connect().

  3. #3
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Dans le client, sauf besoin très particulier, il n'est pas utile de faire un bind. Toute la partie suivante de code peut "dégager" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*bzero(&adr_c, sizeof(adr_c)); */
    memset(&adr_c, 0x0, sizeof(adr_c));
     
    adr_c.sin_family = AF_INET; 
    adr_c.sin_addr.s_addr = INADDR_ANY; 
    adr_c.sin_port = PORTS; 
     
    /*adresse_ip= INADDR_ANY, port = deuxi�me argument;*/
     
    bind(sock, (struct sockaddr*)&adr_c, sizeof(adr_c));
    Pour le remplissage des structures, il faut utiliser les fonctions htons() et htonl(). Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    adr_c.sin_addr.s_addr = htonl(INADDR_ANY); 
    adr_c.sin_port = htonsh(PORTS);
    Le plus important de tout est de tester les retours des fonctions. Que valent les retours de bind(), listen(), accept(), read(), write() et close() ?

    Lorsque tu lances ton serveur (et uniquement lui), quel est le résultat de la commande "netstat -an" ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Jenna, tonton Fred,

    Merci pour vos réponses !

    Je vais tester çà de suite !

    Laurent.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Dans le client :

    Pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    adr_c.sin_family = AF_INET; 
    adr_c.sin_addr.s_addr = INADDR_ANY; 
    adr_c.sin_port = PORTS; 
     
    adr_s.sin_family = AF_INET; 
    adr_s.sin_addr.s_addr = *h->h_addr; 
    adr_s.sin_port = PORTS;
    Dans le serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    adr_s.sin_family = AF_INET; 
    adr_s.sin_addr.s_addr = htonl(INADDR_ANY); 
    adr_s.sin_port = htons(PORTS);
    quels fonctions de conversion dois-je utiliser ?

    Merci et désolé pour ces question bêtes : je débute en C.

    Laurent.

  6. #6
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    côté serveur c'est bon.

    Côté client, comme tu n'as pas besoin de faire le bind(), tu n'as plus besoin de la structure adr_c. Donc le problème se simplifie

    Pour la structure adr_s :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    adr_s.sin_family = AF_INET; 
    /* ici pas besoin de htonl() car le champs h_addr la structure hostent est deja "network order" */
    adr_s.sin_addr.s_addr = *h->h_addr;
    adr_s.sin_port = htons(PORTS);

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Que dois-je analyser dans le "netstat -an" ?

    Comment fait-on pour afficher à l'écran un int (pour afficher les retour) ?

    Est-ce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    int bindReturn
     
    printf("%s/n", (char *)bindReturn);

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    ok, j'ai trouvé pour afficher des int, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d\n", valeurInt);
    Je vais afficher les valeurs des retours...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    J'ai affiché les valeurs des retours :

    Pour le serveur :

    socket : 3
    bind : 0
    listen : 0

    et il bloque au niveau du accept

    ***********************************
    Pour le client :

    socket : 3
    connect : -1

    et le programme plante sur write.

    Que peut-on en déduire ?

  10. #10
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Citation Envoyé par laurent12345 Voir le message
    socket : 3
    connect : -1
    Erreur lors de la connexion

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Est-ce que çà provient de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    h=gethostbyname("localhost");
    Les 2 processus tournent sur la même machine linux.

    (je vais devoir y aller : je serai de retour demain...)

    Laurent.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Cà y est : le serveur réussit à obtenir la chaine du Client !!

    J'ai pu obtenir des infos d'un autre forum :

    dans le client, il fallait remplacer :

    adr_s.sin_addr.s_addr = *h->h_addr;

    par

    adr_s.sin_addr.s_addr = *((unsigned long*)h->h_addr);

    Maintenant il faut que j'améliore ce code car le client doit envoyer au serveur toutes les 15 secondes 2 valeurs aléatoires et son adresse IP et le serveur doit enregistrer le tout dans un fichier en local.

    Donc je pense que je vais avoir encore besoin d'un peu d'aide ;-)

    Merci encore.

    Laurent.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Mauvaise manip...

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

Discussions similaires

  1. 2 machines sur le meme réseau qui ne communiquent pas
    Par potato dans le forum Protocoles
    Réponses: 2
    Dernier message: 15/12/2007, 21h09
  2. [FF] Exemple simple de XML qui ne fonctionne pas
    Par blueice dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/05/2007, 11h39
  3. [Maths] Un génie qui ne communique pas :)
    Par KiLVaiDeN dans le forum La taverne du Club : Humour et divers
    Réponses: 20
    Dernier message: 25/08/2006, 21h24
  4. [C# 2.0] Un exemple de classe générique qui ne compile pas.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h11
  5. Socket qui ne marche pas
    Par Guillaume602 dans le forum C++
    Réponses: 4
    Dernier message: 15/01/2006, 14h07

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