Ip,mask,mac sous linux

Contenu du snippet

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;
}

A voir également

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.