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 :

Probleme avec des socket !


Sujet :

Réseau C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Probleme avec des socket !
    Bonjour a tous,

    Je redebute en C et c'est pas facile facile de recommencer par un pb de socket.
    Si qq'1 a la moindre idée pourquoi mes 2 parties ne communiquent pas correctement, je suis preneur de toutes explications.
    De même si vous avez un site cool qui explique l'utilisation de winsock.h, n'hésiter pas a faire signe.

    Merci d'avance,

    Mathieu

    Partie 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
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc,char *argv[])
    {
    char *prog;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKADDR_IN sin;
    char buffer[256];
    char *msg;
    char *host;
    int boucl,erreur;
    host = argv[1];
    msg = argv[2];
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock==INVALID_SOCKET)
         printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError());
    sin.sin_addr.s_addr			= inet_addr("127.0.0.1");
    sin.sin_family				= AF_INET;
    sin.sin_port				= htons(23);
    erreur = connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     if (erreur!=0)
             printf("\nDesole, je n'ai pas pu ouvrir la session TCP : %d %d",erreur,WSAGetLastError());
    prog=argv[0];
     
    if (argc != 3){
             printf ("Il faut 2 arguments pour executer ce programme");
             exit (1);
             }
     
    //Envoyer la requete au serveur
    printf("envoi de la requete serveur \n");
    write (sock,msg,strlen (msg));
    //lecture de la reponse du serveur
    while ((boucl=read(sock,buffer,sizeof(buffer)))>0)
          write(1,buffer,boucl);
     
    closesocket(sock);
    WSACleanup();
     
    exit;
    }
    Partie 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
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    void renvoi (int s);
     
    int main()
    {
       char *buffer[256]; 
        int nsd,toto;
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    SOCKET sock;
    SOCKET csock;
    SOCKADDR_IN sin;
    SOCKADDR_IN csin;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    sin.sin_addr.s_addr			= INADDR_ANY;
    sin.sin_family				= AF_INET;
    sin.sin_port				= htons(23);
    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    listen(sock, 5);
        while(1)
        {
         int sinsize = sizeof(csin);
         if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
                   {
                    send(csock, "Bonjour Mathieu!\r\n", 14, 0);
                    }
     
     
           renvoi (csock);
           close (csock);
        }
    }
     
     
    /////Fonction de renvoi
    void renvoi (int s)
    {
         char buff[256];
         char *fichier;
         char f[20];
         char *mesgptr;
         char mesg[250];
         int l, c;
         FILE *fp;
         char line [250]={0};
         char *lineptr ;
         // lire une requete
         if ((l=read(s,buff,sizeof(buff))) <=0) return;
         buff [1]='\0';//fin de chaine
         fichier=f;
         if (!strcmp(buff,"janvier")) fichier ="janvier";
              if (!strcmp(buff,"fevrier")) fichier ="fevrier";
                   if (!strcmp(buff,"mars")) fichier ="mars";
                        if (!strcmp(buff,"avril")) fichier ="avril";
                             if (!strcmp(buff,"Mai")) fichier ="mai";
                                  if (!strcmp(buff,"juin")) fichier ="juin";
                                       if (!strcmp(buff,"juillet")) fichier ="juillet";
                                            if (!strcmp(buff,"aout")) fichier ="aout";
                                                 if (!strcmp(buff,"septembre")) fichier ="septembre";
    if ((fp=fopen(fichier,"r"))==NULL)  printf("erreur lors de l'ouverture du fichier");
                                       while (fgets (line,250,fp)){
                                             write (s,line,strlen(line));
                                             }
     
               return ;                                             
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1) En quoi exactement ils "ne communiquent pas correctement" ?
    Informations erronées? Attente sans fin? erreurs?

    2) Le code de renvoi() est quelque peu inintelligible...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Je suis preneur de toute explication concernant le problème et de quelle façon il se manifeste : il ne suffit pas de poster du code et d'attendre qu'on le teste et qu'on le débogue.

    En attendant, essayez de faire plus simple en suivant un tutoriel.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    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 David.Schris
    En attendant, essayez de faire plus simple en suivant un tutoriel.
    Encore plus proche
    http://c.developpez.com/WalrusSock/

    L'indentation du serveur est a revoir.
    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]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Médinoc
    2) Le code de renvoi() est quelque peu inintelligible...
    Et je ne parle pas du test sur argc au milieu de la fonction

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par gentil_robot
    Et je ne parle pas du test sur argc au milieu de la fonction
    Euh...si, tu en parles

    Il me semble qu'il manque un WSACleanup(); dans le serveur, que le serveur ne se termine pas très correctement (pas de "return" ni de "exit()") et que l'appel à "exit()" dans le client souffre d'un manque de parenthèses (c'est une fonction attendant un int en paramètre). Par contre, le "return" à la fin de "renvoi()" n'est peut-être pas utile puisque, justement, elle ne renvoie rien. Plus les mélanges de "close()" et "closesocket()"...
    Mais je n'ai pas tout lu : comme dit précédemment, j'attends d'abord des explications concernant le problème.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    t'inquiète pas pour le main du serveur, il n'est pas suppsé se terminer de toute façon (boucle infinie sans condition de sortie: ce qui importe pour l'instant c'est la comunication avec le client qui "déconne", sans plus de détails...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Reponse de l'auteur du post
    Merci pour toutes vos reactions vives !
    Donc je vous explique ce qu'il en est :
    Le serveur est en attente sur le 23.
    la fonction renvoi doit renvoyer au client fonction du mois qu'il entre le contenu d'un petit fichier (janvier,fevrier,etc).
    Coté client, on le lance avec l'IP serveur et le mois en deuxieme argument.
    Actuellement le serveur tourne mais la communication avec le client ne semble pas opérationnelle.
    De plus comme je vous l'ai dit, je redébute en programmation.
    Le but de ce TP étant plus de faire de l'analyse de trame avec Ethereal ou autre sniffer.
    Merci pour votre aide
    ++

  9. #9
    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 Re: Probleme avec des socket !
    Citation Envoyé par Ptimath44
    Je redebute en C et c'est pas facile facile de recommencer par un pb de socket.
    Est-il nécessaire d'écrire du code aussi mal ? N'est il pas possible d'écrire du code clair ?
    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
     
    /* client.c */
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        WSADATA WSAData;
        WSAStartup (MAKEWORD(2,0), &WSAData);
     
        SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
     
        if (sock==INVALID_SOCKET)
        {
            printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d\n"
                   ,WSAGetLastError());
        }
        else
        {
            SOCKADDR_IN sin;
     
            sin.sin_addr.s_addr = inet_addr("127.0.0.1");
            sin.sin_family      = AF_INET;
            sin.sin_port        = htons(23);
            {
                int erreur = connect(sock, (SOCKADDR *)&sin, sizeof(sin));
     
                if (erreur!=0)
                {
                    printf("\nDesole, je n'ai pas pu ouvrir la session TCP : %d %d\n"
                           ,erreur
                           ,WSAGetLastError());
                }
                else
                {
     
                    //Envoyer la requete au serveur
                    printf("envoi de la requete serveur \n");
                    {
                        char *msg = "requete au serveur\n";
                        send (sock,msg,strlen (msg),0);
                    }
     
                    //lecture de la reponse du serveur
                    {
                        char buffer[256];
     
                        while (recv(sock,buffer,sizeof buffer,0)>0)
                        {
                            putchar(buffer[0]);
                        }
                    }
                }
            }
            closesocket(sock);
        }
        WSACleanup();
        return 0;
    }
    et
    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
     
    /* server.c */
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    // Fonction de renvoi
    void renvoi (SOCKET s)
    {
        char buff[256];
        char *fichier;
        // lire une requete
        int l=recv(s,buff,sizeof buff-1,0);
     
        if (l >0)
        {
            buff [l]='\0';//fin de chaine
            fichier = buff;
     
            FILE *fp=fopen(fichier,"r");
     
            if (fp==NULL)
            {
                printf("erreur lors de l'ouverture du fichier\n");
            }
            else
            {
                char line [250];
                while (fgets (line,sizeof line,fp))
                {
                    send (s,line,strlen(line),0);
                }
                fclose(fp);
            }
        }
    }
     
    int main (void)
    {
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
     
        SOCKET sock;
        sock = socket(AF_INET, SOCK_STREAM, 0);
     
        if (sock==INVALID_SOCKET)
        {
            printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d\n"
                   ,WSAGetLastError());
        }
        else
        {
            SOCKADDR_IN sin;
            sin.sin_addr.s_addr         = INADDR_ANY;
            sin.sin_family            = AF_INET;
            sin.sin_port            = htons(23);
            bind(sock, (SOCKADDR *)&sin, sizeof(sin));
            listen(sock, 5);
     
            while(1)
            {
                SOCKADDR_IN csin;
                int sinsize = sizeof(csin);
                SOCKET csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
     
                if(csock != INVALID_SOCKET)
                {
                    char *s_welcome = "Welcome on the Server\r\n";
     
                    send(csock, s_welcome, strlen(s_welcome), 0);
                    renvoi (csock);
                    closesocket (csock);
                }
                else
                {
                    break;
                }
            }
        }
        return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Merci beaucoup a tous !
    Bien que j'ai ri un peu jaune a la lecture de vos post, je vous remercie tous.
    Le petit client serveur se porte bien maintenant.
    Prochaine étape les RPC mais en attendant il faut que je maitrise les socket basique et la ya deja du boulot.

    Merci à tous
    Ptimath

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Re: Probleme avec des socket !
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* server.c */
    [...]
        if (sock==INVALID_SOCKET)
        {
            printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d\n"
                   ,WSAGetLastError());
        }
        else
    [...]
    Mmmh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* server.c */
    [...]
        if (sock==INVALID_SOCKET)
        {
            printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d\n"
                   ,WSAGetLastError());
            WSACleanup();
            return 1;
        }
        else
    [...]
    Non ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  12. #12
    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 Re: Probleme avec des socket !
    Citation Envoyé par David.Schris
    Mmmh...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* server.c */
    [...]
        if (sock==INVALID_SOCKET)
        {
            printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d\n"
                   ,WSAGetLastError());
            WSACleanup();
            return 1;
        }
        else
    [...]
    Non ?
    Oui. Je ne prétends pas avoir corrigé le code, juste l'avoir rendu un peu plus lisible...
    ou
    pour être portable...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. problème avec des sockets
    Par ddii dans le forum Réseau
    Réponses: 10
    Dernier message: 15/11/2005, 15h53
  2. [FLASH MX] Probleme avec des liens.
    Par maxcmoi dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2005, 11h11
  3. Probleme avec des pointeurs...
    Par barucca dans le forum C++
    Réponses: 5
    Dernier message: 23/08/2005, 21h05
  4. Problemes avec des cellules vides
    Par arsgunner dans le forum ASP
    Réponses: 7
    Dernier message: 14/06/2004, 08h42
  5. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37

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