Question

Sur une machine Linux, les noms d’interface courants ressemblent à eth0, eth1, etc. Je sais comment trouver au moins une adresse IP à l’aide de gethostbyname ou de fonctions similaires, mais je ne connais aucune façon de spécifier quelle interface nommée je veux l'adresse IP de. Je pourrais utiliser ifconfig et analyser le résultat, mais il me semble que cette information semble être ... peu élégante.

Existe-t-il un moyen, par exemple, d’énumérer toutes les interfaces et leurs adresses IP (et éventuellement les adresses MAC) dans une collection? Ou au moins quelque chose du type gethostbyinterface ("eth0") ?

Était-ce utile?

La solution

// Originally from http://www.tlug.org.za/wiki/index.php/Obtaining_your_own_IP_address

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

/**
 * getIPv4()
 *
 * This function takes a network identifier such as "eth0" or "eth0:0" and
 * a pointer to a buffer of at least 16 bytes and then stores the IP of that
 * device gets stored in that buffer.
 *
 * it return 0 on success or -1 on failure.
 *
 * Author:  Jaco Kroon <jaco@kroon.co.za>
 */
int getIPv4(const char * dev, char * ipv4) {
    struct ifreq ifc;
    int res;
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockfd < 0)
        return -1;
    strcpy(ifc.ifr_name, dev);
    res = ioctl(sockfd, SIOCGIFADDR, &ifc);
    close(sockfd);
    if(res < 0)
        return -1;     
    strcpy(ipv4, inet_ntoa(((struct sockaddr_in*)&ifc.ifr_addr)->sin_addr));
    return 0;
}


int main() {
    char ip[16];
    if(getIPv4("eth0", ip) == 0)
        printf("IPv4: %s\n", ip);
    else
        printf("No IP\n");
    return 0;
 }

Mettre à jour : lien mort déplacé vers un commentaire (pour la postérité) (merci @obayhan) et ajout de la coloration syntaxique.

Autres conseils

modifier: j'ai vu que vous n'aimiez pas les bombardements. Ensuite, vous pouvez voir comment ifconfig fait son travail (il extrait au moins certaines informations de / proc).

Lorsque vous avez le nom de l'interface, vous pouvez le faire (dans votre shell):

ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'

Pour énumérer les interfaces, vous pouvez utiliser ceci:

ifconfig | egrep '^[^ ]' | awk '{print $1}'

Combiné:

for x in `ifconfig | egrep '^[^ ]' | awk '{print $1}'`; do
  echo -n "${x}"
  echo -n "    "
  ifconfig "${x}" | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'
done
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top