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 :

[structure] Initialisation nécessaire ?


Sujet :

Réseau C

  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut [structure] Initialisation nécessaire ?
    Bonjour,

    J'utilise les fonctiosn gethostname et gethostbyname afin de récupérer l'adresse IP d'une machine.

    La fonction gethostbyname rempli une variable de type hostent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     struct hostent {
             char    *h_name;         /* canonical name of host */
             char    **h_aliases;     /* alias list */
             int     h_addrtype;      /* host address type */
             int     h_length;        /* length of address */
             char    **h_addr_list;   /* list of addresses */
         };
    Mon soucis est le suivant : est-il nécessaire d'initialiser les champs de cette structure ou non (normalement oui), sachant que l'exemple du man (solaris 5.8) ne les rempli pas ?
    Voici un exemple de test, basé sur celui du man.
    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
     
     
    /* Necessite d'utiliser l'option -lnsl pour compiler */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <unistd.h>
     
     
    int main (void)
    {
    	struct hostent *hp; /* la variable de type hostent qui pose probleme */
    	char **p; /* utilisé pour parcourir le tableau de resultat */
    	int ret; /* code de retour */
    	char hostname[256]; /*nom d'hote*/
     
    	ret = sethostent (1); /* initalisation des hotes */
    	printf ("ret sethostent = %d\n", ret); :*debug*/
     
    	ret = gethostname (hostname, 256); /* récupération du nom d'hote */
    	printf ("ret gethostname = %d ; hostname : %s\n", ret, hostname); /*debug*/
     
    	hp = gethostbyname (hostname); /* appel pour recuperer les adresses IP */
     
    	for (p = hp->h_addr_list; *p != 0; p++) { /*parcour du tableau de resultat, issu du man */
    		struct in_addr in;
    		char **q;
    		(void) memcpy(&in.s_addr, *p, sizeof (in.s_addr));
    		(void) printf("%s\t%s", inet_ntoa(in), hp->h_name);
    		for (q = hp->h_aliases; *q != 0; q++)
    		(void) printf(" %s", *q);
    		(void) putchar('\n');
    	}
    	endhostent();
    	exit (0);
    }
    Merci.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Salut,
    Il y a un problème si tu n'initialise pas la structure :
    Quelle problème :
    Normalement, il n'y as pas d'initialisation à faire (peut être testé le retour de la fonction si ele peut échouer).

    P.S. : quelques conseilles pour le code
    • Tu peut enlevé les (void) avant les fonction memcpy, printf...
    • La fonction exit() ne termine pas correctement un programme, il faut utiliser return
    • Le nom de l'hote ne peut pas dépasser les 255 caractères :

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Juste un detail,
    Citation Envoyé par gege2061
    Tu peut enlevé les (void) avant les fonction memcpy, printf...
    Peut-etre que gangsoleil utilise un verificateur de code tel que lint, qui a la desagreable habitude de se plaindre des qu'un retour de fonction est ignore (comme souvent avec printf). Mettre un void devant permet de lui couper le sifflet en disant "je sais, cette fonction retourne quelque-chose, mais je m'en moque".

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par DaZumba
    Peut-etre que gangsoleil utilise un verificateur de code tel que lint, qui a la desagreable habitude de se plaindre des qu'un retour de fonction est ignore (comme souvent avec printf). Mettre un void devant permet de lui couper le sifflet en disant "je sais, cette fonction retourne quelque-chose, mais je m'en moque".
    Dans ce quoi, soit faut en mettre à toutes les fonctions et ça alourdie inutilement le code, soit changer de logiciel de vérification.

  5. #5
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    gege2061:
    Le nom de l'hote ne peut pas dépasser les 255 caractères
    En principe le nom de l'hôte ne doit pas dépasser 255 caractères sous Windows, même si je ne suis pas 100% sur... et même gangsoleil spécifie la taille maximum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gethostname (hostname, 256);
    Donc il n'y aura jamais de débordement !

    Je ne suis pas sur à 100% car je n'ai pas de code avec moi, mais je crois que je ne l'initialise pas non plus, et je n'ai jamais eu de problème avec.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    je vous remercie pour toutes ces précisions.

    Pour info,
    • les (void) devant le code sont ceux de l'exemple du man. Je les ai supprimé dans mon code
    • Pareil pour l'appel à exit
    • Effectivement, j'ai un doute sur le nombre de caractères maximal du nom d'hôte. je vais me renseigner et régler ce problème




    merci à vous

    PS
    Citation Envoyé par Ti-R
    En principe le nom de l'hôte ne doit pas dépasser 255 caractères sous Windows,
    Comme précisé, je développe sous Solaris 5.8
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    sachant que l'exemple du man (solaris 5.8 ne les rempli pas ? )
    Le man de solaris pouvait être trouvé sur le net comme exemple... c'est ce que j'en ai déduit

    Sinon je confirme que sous Windows je n'initialise pas la variable hostent et cela parait logique, car je n'avais pas trop regardé ton code, je pensais me souvenir à tord que c'était un passage en paramètre du pointeur, ce qui pouvait générer ton problème, mais c'est un retour de fonction..... donc forcément il n'y a pas besoin d'être initialisé... car la fonction s'appelle gethostbyname (hostname) et a la fin de l'exécution renvoie un pointeur sur une structure, la question serait +, faut t'il la libérer...

    Extrait de la MFC:
    The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls.
    Donc en principe les sockets doivent gérer ce bout de code...à vérifier sur solaris

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2013, 17h42
  2. [Débutant]Structure Tableau, initialisation
    Par faulk dans le forum C++
    Réponses: 14
    Dernier message: 09/06/2006, 15h45
  3. initialisation chaine de caracteres dans structure
    Par mrttlemonde dans le forum C
    Réponses: 2
    Dernier message: 08/04/2006, 18h07
  4. initialiser les membres d'une structure
    Par molesqualeux dans le forum C
    Réponses: 8
    Dernier message: 02/02/2006, 19h57
  5. [Initialisation] Remplir une structure une fois
    Par Kimael dans le forum Langage
    Réponses: 14
    Dernier message: 08/06/2004, 15h33

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