Ce petit code montre comment on peut :
- Itérer sur les devices disponible (eth0, eth1, lo, vmnet si il y en a, ...) (if_nameindex)
- Récupérer l'adresse ip du device (iocl)
- Récupérer le masque de sous réseau du device (ioctl)
- Récupérer l'adresse mac (ioctl)
Source / Exemple :
#include <sys/ioctl.h> // pour ioctl
#include <net/if.h> // pour ifreq
#include <string.h> // pour strcpy
#include <unistd.h> // pour close
#include <arpa/inet.h> // pour inet_ntoa
#include <stdio.h> // pour printf
#include <errno.h> // pour errno
int main(int argc, char **argv) {
int descSock;
struct ifreq devea;
struct sockaddr_in *sa;
//récupération d'un pointeur sur toutes les cartes disponible;
struct if_nameindex *nameindex = if_nameindex();
if(nameindex == NULL){
perror("if_nameindex ");
return errno;
}
int i = 0;
while(1){
if(nameindex[i].if_name == NULL) break;//il n'y a plus de cates on sort
//Copie du nom dans la structure ifreq et au passage on prépare l'index pour la prochaine carte
strcpy(devea.ifr_name, nameindex[i++].if_name);
//Affichage de celui-ci
printf("%s\n", devea.ifr_name);
//on ouvre un socket pour chacune des cartes que l'on closera après
descSock = socket(AF_INET, SOCK_DGRAM, 0);
if (descSock < 0){
perror("socket ");
//On relache le pointeur dynamiquement alloue par if_nameindex
if_freenameindex(nameindex);
return errno;
}
//Récupération de l'adresse ip
printf("\tIP\t:\t");
if (ioctl(descSock,SIOCGIFADDR, &devea) < 0)
printf("ERROR MAYBE NOT STARTED ?\n");
else{
//Récupère la structure sockaddr_in contenue dans ifreq
sa = (struct sockaddr_in *)&devea.ifr_ifru.ifru_addr;
//Convertion en ascii
printf("%s\n", inet_ntoa(sa->sin_addr));
}
//Récupération du masque de sous réseau
printf("\tMASK\t:\t");
if (ioctl(descSock,SIOCGIFNETMASK, &devea) < 0)
printf("ERROR MAYBE NOT STARTED ?\n");
else{
//Récupère la structure sockaddr_in contenue dans ifreq
sa = (struct sockaddr_in*) &devea.ifr_ifru.ifru_netmask;
//Convertion en ascii
printf("%s\n", inet_ntoa(sa->sin_addr));
}
//Récupération de la MAC adresse
printf("\tMAC\t:\t");
if (ioctl(descSock,SIOCGIFHWADDR, &devea) < 0)
printf("ERROR\n");
else{
//Affichage de la mac adresse
printf("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n\n",
(devea.ifr_hwaddr.sa_data[0]&0xFF),
(devea.ifr_hwaddr.sa_data[1]&0xFF),
(devea.ifr_hwaddr.sa_data[2]&0xFF),
(devea.ifr_hwaddr.sa_data[3]&0xFF),
(devea.ifr_hwaddr.sa_data[4]&0xFF),
(devea.ifr_hwaddr.sa_data[5]&0xFF));
}
//Ferme le socket pour passer au prochain
close(descSock);
}
if(i == 0)//petit affichage pour le fun :D
printf("Aucune carte disponible !!!\n");
//Relache le pointeur dynamiquement alloue par if_nameindex
if_freenameindex(nameindex);
return 0;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.