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 :

Récupération d'une adresse IP en C


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Récupération d'une adresse IP en C
    Bonjour à tous,

    Je travaille actuellement sur un projet qui a besoin d'utiliser les fonctionnalités réseaux de base ( socket ), mais je souhaite gérer un fichier de configuration afin que l'utilisateur final puisse choisir sur quelle interface mon daemon va écouter ( eth0, eth1, etc ... )

    Ma première idée a été d'essayer de recuperer l'adresse IP associée à ethX et la passer lors de ma creation de socket.
    Seul petit problème, je ne vois absolument pas comment récuper cette adresse IP en C.

    La seule solution que je voyais était de passer par un popen de ifconfig ou ip addr show, bref, pas très élégant.

    Ma question est donc la suivante :

    Comment peut-on faire, sous Linux, pour récuper l'adresse IP associée à une interface ?


    Je vous remercie d'avance.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Solution
    Salut à tous,

    Bon, après re-lecture des pages de man et du code source de dhcp3-server, je suis arrivé à mes fins :

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<string.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include<errno.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
     
    int main(void){
     
            char buf [2048];
            struct ifconf ic;
            int i;
            int sock;
    	struct ifreq *ifp;
            struct sockaddr_in *s; 
    	char if_name[32];
    	char if_addr[32];
     
    	/* Creation de notre socket permettant d'utiliser notre IOCTL */
    	if ((sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
    		fprintf(stderr,"Erreur lors de la creation de la socket pour l'ioctl : %s\n",strerror(errno));
    		exit(EXIT_FAILURE);
    	}
     
    	/* On fournit un buffer vide afin de savoir de combien de place il aura besoin */
    	ic.ifc_len = 0;
    	ic.ifc_ifcu.ifcu_buf = (caddr_t)NULL;
     
    getif_again:
    	i = ioctl(sock, SIOCGIFCONF, &ic);
     
    	if(i<0){
    		fprintf(stderr,"Erreur lors de l'appel a IOCTL : %s\n",strerror(errno));
    		exit(EXIT_FAILURE);
    	}
     
    	/* On verifie qu'il n'y a pas eu de bug */
    	if(ic.ifc_ifcu.ifcu_buf == 0 && ic.ifc_len == 0){
    		fprintf(stderr,"Bug trouve\n");
    		/* On passe par le buffer que l'on a cree */
    		ic.ifc_len = sizeof buf;
    		ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
    		goto getif_again;
    	}
     
    	/* On verifie que toutes les donnees ont pu tenir dans notre buffer
    	 * Sinon on en alloue un plus grand
    	 * Cf page de man de netdevice pour les conseils
    	 * */
    	if ((ic.ifc_ifcu.ifcu_buf == buf || ic.ifc_ifcu.ifcu_buf == 0) && ic.ifc_len > sizeof buf){
    		if( (ic.ifc_ifcu.ifcu_buf = malloc ((size_t)ic.ifc_len)) == NULL ){
    			fprintf(stderr,"Erreur lors du malloc pour la definition du buffer : %s\n",strerror(errno));
    			exit(EXIT_FAILURE);
    		}
    		/* On refait notre IOCTL */
    		goto getif_again;
    	}else if(ic.ifc_ifcu.ifcu_buf == 0){
    		ic.ifc_ifcu.ifcu_buf = (caddr_t)buf;
    		ic.ifc_len = sizeof buf;
    		goto getif_again;
    	}
     
    	for(i=0;i<ic.ifc_len;){
    		/* Notre pointeur sur notre tableau d'elements ifreq */ 
    		ifp = (struct ifreq *)((caddr_t)ic.ifc_req + i);
     
    		/* On se deplace pour sauter au prochain element */
    		i += sizeof *ifp;
     
     
    		/* Notre pointeur sur notre structure de type sockaddr_in */
    		//interface = (struct sockaddr *) &ifp->ifr_addr;
     
    		/* On recupere les infos qui nous interessent */
    		/* Nom de l'interface */
    		strcpy(if_name,ifp->ifr_name);
     
    		/* Adresse de l'interface */
    		s = (struct sockaddr_in *) &(ifp->ifr_addr);
    		strcpy(if_addr,inet_ntoa(s->sin_addr));
     
    		fprintf(stdout,"Informations sur l'interface %s :\n\tAddresse : %s\n\n",if_name,if_addr);
    	}
     
    	return(EXIT_SUCCESS);
    }
    Voilà voilà

  3. #3
    Inactif
    Inscrit en
    Juin 2008
    Messages
    304
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 304
    Par défaut
    Utiliser la Balise [CODE] pour afficher ton code.

    http://www.developpez.net/forums/mis...do=bbcode#code

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

Discussions similaires

  1. Récupération d'une adresse IP d'un TextField
    Par samy2590 dans le forum Général Java
    Réponses: 12
    Dernier message: 29/08/2012, 15h52
  2. [RegEx] Récupération d'une adresse e-mail entre parenthèses
    Par bruntho dans le forum Langage
    Réponses: 2
    Dernier message: 10/11/2010, 18h54
  3. Réponses: 5
    Dernier message: 29/06/2009, 16h11
  4. Récupération d'une adresse mac
    Par ouss dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/04/2009, 10h00
  5. Réponses: 6
    Dernier message: 28/02/2006, 17h41

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