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

Linux Discussion :

voir les termes d'une structure


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut voir les termes d'une structure
    Bonjour,
    je débute dans la programmation en C avec les sockets, et dans un ridicule exemple de serveur, la fonction bind ne se passe pas bien donc je voudrais contrôler ce que valent les termes de la struct sockaddr qui lui est passée en argument.
    Je vous mets le code ci dessous si jamais quelqu'un peut m'expliquer pourquoi ça plante dans le bind.

    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
    /* ceci est un essai pour comprendre ce qui se passe avec le net */
    /* gcc snd.c -o snd */
    /* mysocket = socket(int socket_family, int socket_type, int protocol); */
    /* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
    /*  socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #define MAXNOM 32
    void renvoi(int s) ;
    /* programme serveur */
    main(argc,argv)
    int argc ;
    char *argv[] ;
    {
    int sd,lacc, nsd ;
    struct sockaddr_in adsock, adacc; /* struc adresse internet */
    struct hostent *hptr ;             /* infos recuperes sur le host */
    struct servent *sptr ;                        /* infos recuperes sur le service */
    char machine[MAXNOM+1] ;                 /* nom de la machine locale */
    char *prog ;                            /*nom de ce programme */
    char *mesg ;
    prog = argv[0] ;
    /* prendre les infos sur le service */
    /* struct servent *getservbyname(const char *name, const char *proto); */
    if((sptr = getservbyname("ftp","tcp")) == NULL ) {
             printf("probleme : service inconnu\n") ;
             exit(1) ;
             }
    /* recuperer le nom de la machine locale */
    gethostname(machine,MAXNOM) ;
    /* DVA le 7/08/2008: */
    printf("\nmachine=%s\n",machine);
    /* prendre les infos sur la machine locale */
    if((hptr = gethostbyname(machine)) == NULL) {
             printf("probleme : host inconnu\n") ;
             exit(1) ;
             }
    bzero((char*)&adsock, sizeof(adsock));
    /*initialiser la struct adsock avec les infos recuperes */
    bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
    adsock.sin_family = AF_INET ;
    /* recupere le numero du port */
    adsock.sin_port = sptr->s_port ;
    adsock.sin_addr.s_addr = INADDR_ANY ;
    /* creer maintenant un socket */
    if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
              printf("probleme lors de la creation de socket \n") ;
              exit(1) ;
              }
    /* DVA le 7/08/2008: */
    printf("socket Ok; sd=%d\n",sd);
    /* on va faire un bind sur le socket */
    /* mais avant y faudrait contrôler la sockaddr */
     
    /* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
     
    if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) {
              printf("problème avec le bind\n") ;
              exit(1) ;
              }
    /* initialiser la queue d'écoute */
    listen(sd,5) ; /* backlog = 5 */
    /* bouble d'attente de nouvelles connexions */
    for(;;){
              lacc = sizeof(adacc) ;
              /* boucle d'accept */
              if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 )
                       {
                       /* adacc -> infos du client */
                       printf("erreur sur l'accept \n") ;
                       exit(1) ;
                       }
    renvoi(nsd) ;
    close(nsd);
    }
    }
    /* fonction renvoi */
    void renvoi(s)
    int s ;
    {
    char buf[256];
    char *fichier;
    char f[20];
    char *mesgptr;
    char mesg[250];
    int l, c;
    FILE *fp ;
    char line[250] ={0} ;
    char *lineptr = NULL;
    /* lire une requete */
    if((l=read(s, buf, sizeof(buf))) <= 0)
              return ;
    buf[l] = '\0' ;         /*fin de chaine */
    fichier=f;
    if (!strcmp(buf,"lion")) fichier = "lion" ;
    if (!strcmp(buf,"cancer")) fichier = "cancer" ;
    if (!strcmp(buf,"scorpion")) fichier = "scorpion" ;
    if (!strcmp(buf,"taureau")) fichier = "taureau" ;
    if (!strcmp(buf,"vierge")) fichier = "vierge" ;
    if (!strcmp(buf,"poisson")) fichier = "poisson" ;
    if (!strcmp(buf,"capricorne")) fichier = "capricorne" ;
    if (!strcmp(buf,"balance")) fichier = "balance" ;
    if (!strcmp(buf,"belier")) fichier = "belier" ;
    if (!strcmp(buf,"verseau")) fichier = "verseau" ;
    if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ;
    if((fp=fopen(fichier,"r"))==NULL) {
             printf("erreur lors de l'ouverture du fichier\n");}
    while(fgets(line,240,fp)){
                     write(s, line, strlen(line)) ;
                     }
    return ;
    }
    /* fin */
    Et voici le résultat des courses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    david@david-desktop:~/Snet$ gcc snd.c -o snd
    david@david-desktop:~/Snet$ ./snd
     
    machine=david-desktop
    socket Ok; sd=3
    problème avec le bind
    david@david-desktop:~/Snet$
    merci d'y avoir jeté un oeil,
    David

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    si tu avais afficher les erreurs, tu aurais compris le problème : permission denied
    en clair, il faut être root pour binder sur un port < 1024
    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
    123
    124
    125
    126
    127
    128
    129
    130
    /* ceci est un essai pour comprendre ce qui se passe avec le net */
    /* gcc snd.c -o snd */
    /* mysocket = socket(int socket_family, int socket_type, int protocol); */
    /* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
    /*  socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
     
    /* fonction renvoi */
    static void renvoi (int s)
    {
       char buf[FILENAME_MAX];
       ssize_t l = read (s, buf, sizeof buf);
     
       if (l == -1)
       {
          perror ("read");
       }
       else if (l > 0)
       {
          FILE *fp;
          buf[l] = 0;               /*fin de chaine */
     
          if ((fp = fopen (buf, "r")) == NULL)
          {
             perror ("erreur lors de l'ouverture du fichier");
          }
          else
          {
             while (fgets (buf, FILENAME_MAX, fp) != NULL)
             {
                write (s, buf, strlen (buf));
             }
          }
       }
    }
    /* fin */
     
    /* programme serveur */
    int main (void)
    {
       struct servent *sptr = getservbyname ("ftp", "tcp");
     
       if (sptr == NULL)
       {
          perror ("probleme : service inconnu");
       }
       else
       {
          char machine[HOST_NAME_MAX + 1];    /* nom de la machine locale */
       /* recuperer le nom de la machine locale */
          if (gethostname (machine, sizeof machine) == -1)
          {
             puts ("error gethostname");
          }
          else
          {
             struct hostent *hptr = gethostbyname (machine);
             printf ("machine = %s\n", machine);
     
             if (hptr == NULL)
             {
                perror ("probleme : host inconnu");
             }
             else
             {
                int sd = socket (PF_INET, SOCK_STREAM, 0);
     
                if (sd < 0)
                {
                   perror ("probleme lors de la creation de socket");
                }
                else
                {
                   struct sockaddr_in adsock =
                   {
                      .sin_family = AF_INET,
                      .sin_port = sptr->s_port,
                      .sin_addr.s_addr = INADDR_ANY
                   };
     
                   printf ("socket Ok; sd = %d\n", sd);
     
                   if (bind (sd, (struct sockaddr *) &adsock, (socklen_t) (sizeof adsock)) == -1)
                   {
                      perror ("problème avec le bind");
                   }
                   else
                   {
     
                      if (listen (sd, 5) == -1)
                      {
                         perror ("listen");
                      }
                      else
                      {
                         puts ("waiting connection...");
                      /* bouble d'attente de nouvelles connexions */
                         for (;;)
                         {
                            struct sockaddr_in adacc;  /* struc adresse internet */
                            socklen_t lacc = (socklen_t) (sizeof adacc);
                            int nsd = accept (sd, (struct sockaddr *) &adacc, &lacc);
                            /* boucle d'accept */
                            if (nsd == -1)
                            {
                               /* adacc -> infos du client */
                               perror ("erreur sur l'accept");
                               break;
                            }
                            else
                            {
                               renvoi (nsd);
                               close (nsd), nsd = -1;
                            }
                         }
                      }
                   }
                   close (sd), sd = -1;
                }
             }
          }
       }
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut oui en effet,
    ça marche avec "sudo" qui me met root sous Linux Ubuntu; et maintenant mon petit serveur se met bien dans la boucle infinie d'attente de nouvelles connexions, (j'ai mis un printf dans la boucle en question pour savoir où il en était) ... donc ce qui se passe est que mon petit programme client n'arrive pas à obtenir d'infos sur le serveur.
    Voici le code du 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
     
    /* ceci est un essai pour comprendre ce qui se passe avec le net */
    /* programme client */
    /* gcc rcv.c -o rcv */
    /* ./rcv david-desktop mai */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    main(argc,argv)
    int argc ;
    char *argv[] ;
    {
    int sd,lon ;
    struct sockaddr_in adsock;
    struct hostent *hptr ;           /* infos recuperes sur le host */
    struct servent *sptr ;           /* infos recuperes sur le service */
    char buf[256] ;                  /*buffer de lecture des infos */
    char *prog ;                     /*nom de ce programme */
    char *host ;                     /*pointeur sur le nom du host distant */
    char *mesg ;
    char *resg ;                     /*pointeur sur l'utilisateur distant */
    prog = argv[0] ;
    /* verification du nombre d'arguments de la ligne de commande */
    if (argc != 3) {
            printf("il faut trois arguments\n") ;
            exit(1) ;
            }
    host = argv[1] ;
    mesg = argv[2] ;
    /* prendre les infos sur le host */
    /* DVA le 7/08/2008: */
    printf("host=%s\n",host);
    if((hptr = gethostbyname(host)) == NULL) {
            perror("gethostbyname");
            printf("probleme d'infos sur le host \n") ;
            exit(1) ;
            }
    /* initialiser la struct adsock avec les infos recuperes */
    /* c a d l'adresse du host et le domaine internet */
    bcopy((char *)hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
    adsock.sin_family = hptr->h_addrtype ;
    /* prendre les infos sur le service */
    if((sptr = getservbyname("2223","tcp")) == NULL ) {
             printf("probleme d'infos sur le service \n") ;
             exit(1) ;
             }
    /* recupere le numero du port */
    adsock.sin_port = sptr->s_port ;
    /* creer maintenant un socket */
    if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
             printf("probleme lors de la creation de socket \n") ;
             exit(1) ;
             }
    /* etablir la connexion avec le serveur */
    if((connect(sd,( struct sockaddr * ) &adsock,sizeof(adsock))) < 0 ) {
             printf("probleme de connexion \n") ;
             exit(1) ;
             }
    /* on va envoyer la requete */
    if((write(sd, mesg, strlen(mesg))) < 0 ) {
             printf("erreur sur le write \n") ;
             exit(1) ;
             }
    /* lecture de la reponse du serveur */
    while((lon =read(sd, buf, sizeof(buf))) > 0)
             /* affichage de la reponse sur l'ecran */
             write(1, buf, lon) ;
    /* on ferme le socket */
    close(sd) ;
    exit(0) ;
    }
    /* fin */
    Ce que me donne l'exécution du client est ça, (alors que le serveur tourne avec sudo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    david@david-desktop:~/Snet$ gcc rcv.c -o rcv
    david@david-desktop:~/Snet$ ./rcv david-desktop mai
    host=david-desktop
    probleme d'infos sur le service 
    david@david-desktop:~/Snet$
    Alors il ne me parait pas totalement anormal que le gethostbyname ne connaisse pas mon PC; alors pourrais-je lui demander d'être reconnu par l'adresse IP que mon FAI m'a attribuée aujourd'hui, et comment pourrais je la connaitre sans m'envoyer un mèl à moi même pour pouvoir lire mon adresse IP dans la source d'icelui, puisque c'est la seule méthode que je connaisse pour ce faire.
    Merci de me donner quelques tuyaux,
    David

  4. #4
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut Merci Nicolas...
    ... j'ai laissé éclater ma joie sur sur l'autre forum où tu sembles te ballader aussi; voici pour d'autres les codes génialissimes de mon client et de son 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
    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
    /* ceci est un essai pour comprendre ce qui se passe avec le net */
    /* gcc snd.c -o snd */
    /* mysocket = socket(int socket_family, int socket_type, int protocol); */
    /* The protocol modules are grouped into protocol families like PF_INET, PF_IPX, PF_PACKET and socket types like SOCK_STREAM or SOCK_DGRAM */
    /*  socket(2) creates a socket, connect(2) connects a socket to a remote socket address, the bind(2) function binds a socket to a local socket address, listen(2) tells the socket that new connections shall be accepted, and accept(2) is used to get a new socket with a new incoming connection. */
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #define MAXNOM 32
    void renvoi(int s) ;
    /* programme serveur */
    main(argc,argv)
    int argc ;
    char *argv[] ;
    {
    int sd,lacc, nsd ;
    struct sockaddr_in adsock, adacc; /* struc adresse internet */
    struct hostent *hptr ;             /* infos recuperes sur le host */
    struct servent *sptr ;                        /* infos recuperes sur le service */
    char machine[MAXNOM+1] ;                 /* nom de la machine locale */
    char *prog ;                            /*nom de ce programme */
    char *mesg ;
    prog = argv[0] ;
    /* prendre les infos sur le service */
    /* struct servent *getservbyname(const char *name, const char *proto); */
    if((sptr = getservbyname("ftp","tcp")) == NULL ) {
             printf("probleme : service inconnu\n") ;
             exit(1) ;
             }
    /* recuperer le nom de la machine locale */
    gethostname(machine,MAXNOM) ;
    /* DVA le 7/08/2008: */
    printf("\nmachine=%s\n",machine);
    /* prendre les infos sur la machine locale */
    if((hptr = gethostbyname(machine)) == NULL) {
             printf("probleme : host inconnu\n") ;
             exit(1) ;
             }
    bzero((char*)&adsock, sizeof(adsock));
    /*initialiser la struct adsock avec les infos recuperes */
    bcopy((char *)&hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
    adsock.sin_family = AF_INET ;
    /* recupere le numero du port */
    adsock.sin_port = sptr->s_port ;
    adsock.sin_addr.s_addr = INADDR_ANY ;
    /* creer maintenant un socket */
    if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
              printf("probleme lors de la creation de socket \n") ;
              exit(1) ;
              }
    /* DVA le 7/08/2008: */
    // printf("socket Ok; sd=%d\n",sd);
    /* on va faire un bind sur le socket */
    /* mais avant y faudrait contrôler la sockaddr */
    /* int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); */
    if(bind(sd,(struct sockaddr *) &adsock ,sizeof(adsock) ) == -1 ) {
              perror("bind");
              printf("problème avec le bind\n") ;
              exit(1) ;
              }
    /* initialiser la queue d'écoute */
    listen(sd,5) ; /* backlog = 5 */
    /* boucle d'attente de nouvelles connexions */
    /* DVA le 7/08/2008: */
    printf("Ok attente...\n\n");
    for(;;){
              lacc = sizeof(adacc) ;
              /* boucle d'accept */
              if((nsd = accept(sd, ( struct sockaddr * ) &adacc, &lacc)) < 0 )
                       {
                       /* adacc -> infos du client */
                       printf("erreur sur l'accept \n") ;
                       exit(1) ;
                       }
    renvoi(nsd) ;
    close(nsd);
    }
    }
    /* fonction renvoi */
    void renvoi(s)
    int s ;
    {
    char buf[256];
    char *fichier;
    char f[20];
    char *mesgptr;
    char mesg[250];
    int l, c;
    FILE *fp ;
    char line[250] ={0} ;
    char *lineptr = NULL;
    /* lire une requete */
    if((l=read(s, buf, sizeof(buf))) <= 0)
              return ;
    buf[l] = '\0' ;         /*fin de chaine */
    fichier=f;
    if (!strcmp(buf,"mai")) fichier = "mai" ;
    if (!strcmp(buf,"lion")) fichier = "lion" ;
    if (!strcmp(buf,"cancer")) fichier = "cancer" ;
    if (!strcmp(buf,"scorpion")) fichier = "scorpion" ;
    if (!strcmp(buf,"taureau")) fichier = "taureau" ;
    if (!strcmp(buf,"vierge")) fichier = "vierge" ;
    if (!strcmp(buf,"poisson")) fichier = "poisson" ;
    if (!strcmp(buf,"capricorne")) fichier = "capricorne" ;
    if (!strcmp(buf,"balance")) fichier = "balance" ;
    if (!strcmp(buf,"belier")) fichier = "belier" ;
    if (!strcmp(buf,"verseau")) fichier = "verseau" ;
    if (!strcmp(buf,"gemeaux")) fichier = "gemeaux" ;
    if((fp=fopen(fichier,"r"))==NULL) {
            printf("erreur lors de l'ouverture du fichier\n");}
    while(fgets(line,240,fp)){
                    write(s, line, strlen(line)) ;
                     }
    return ;
    }
    /* fin */
    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
     
    /* ceci est un essai pour comprendre ce qui se passe avec le net */
    /* programme client */
    /* gcc rcv.c -o rcv */
    /* ./rcv david-desktop mai */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    main(argc,argv)
    int argc ;
    char *argv[] ;
    {
    int sd,lon ;
    struct sockaddr_in adsock;
    struct hostent *hptr ;           /* infos recuperes sur le host */
    struct servent *sptr ;           /* infos recuperes sur le service */
    char addr[16] ;                  /* buffer de stockage de l'adresse; DVA le 7/08/2008 */
    char buf[256] ;                  /* buffer de lecture des infos */
    char *prog ;                     /* nom de ce programme */
    char *host ;                     /* pointeur sur le nom du host distant */
    char *mesg ;
    char *resg ;                     /* pointeur sur l'utilisateur distant */
    prog = argv[0] ;
    /* verification du nombre d'arguments de la ligne de commande */
    if (argc != 3) {
            printf("il faut trois arguments\n") ;
            exit(1) ;
            }
    host = argv[1] ;
    mesg = argv[2] ;
    /* prendre les infos sur le host */
    /* DVA le 7/08/2008: */
    printf("host=%s\n",host);
    if((hptr = gethostbyname(host)) == NULL) {
            perror("gethostbyname");
            printf("probleme d'infos sur le host \n") ;
            exit(1) ;
            }
    /* initialiser la struct adsock avec les infos recuperes */
    /* c a d l'adresse du host et le domaine internet */
    bcopy((char *)hptr->h_addr,(char*)&adsock.sin_addr,hptr->h_length) ;
    adsock.sin_family = hptr->h_addrtype ;
    /* prendre les infos sur le service */
    if((sptr = getservbyname("ftp","tcp")) == NULL ) {
             printf("probleme d'infos sur le service \n") ;
             exit(1) ;
             }
    /* recupere le numero du port */
    adsock.sin_port = sptr->s_port ;
    /* creer maintenant un socket */
    if((sd = socket(AF_INET,SOCK_STREAM,0))<0) {
             printf("probleme lors de la creation de socket \n") ;
             exit(1) ;
             }
    /* etablir la connexion avec le serveur */
    if((connect(sd,( struct sockaddr * ) &adsock,sizeof(adsock))) < 0 ) {
             printf("probleme de connexion \n") ;
             exit(1) ;
             }
    /* on va envoyer la requete */
    if((write(sd, mesg, strlen(mesg))) < 0 ) {
             printf("erreur sur le write \n") ;
             exit(1) ;
             }
    /* lecture de la reponse du serveur */
    while((lon =read(sd, buf, sizeof(buf))) > 0)
             /* affichage de la reponse sur l'ecran */
             write(1, buf, lon) ;
    /* on ferme le socket */
    close(sd) ;
    exit(0) ;
    }
    /* fin */

  5. #5
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut merci encore Nicolas, ...
    j'ai fini par récupérer le code que tu avais corrigé et nettoyé pour le coté serveur de mon bidule. C'est effectivement nettement plus propre. (À ma décharge, ce que j'ai utilisé pour commencer vient de là : ftp://ftp.imag.fr/pub/archive/doc-un...TS/sockets.pdf
    Je vais m'inspirer de ton code pour modifier selon la même philosophie le coté client de mon bidule, et par la suite voici où en sont mes interrogations : http://forum.ubuntu-fr.org/viewtopic.php?id=242949 .

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

Discussions similaires

  1. comment voir et modifier les membres d'une structure ?
    Par dva2tlse dans le forum Débuter
    Réponses: 12
    Dernier message: 22/11/2008, 14h07
  2. Ne pas voir les liens d'une page !
    Par nicof3 dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2006, 12h22
  3. initialiser les membres d'une structure
    Par molesqualeux dans le forum C
    Réponses: 8
    Dernier message: 02/02/2006, 19h57
  4. padding entre les elements d'une structure
    Par chacal dans le forum Réseau
    Réponses: 5
    Dernier message: 18/11/2005, 08h56
  5. Récupérer les élements d'une structure ...
    Par Franck.H dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 17/10/2005, 15h48

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