Ip,mask,mac sous linux

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 287 fois - Téléchargée 28 fois

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

Ajouter un commentaire

Commentaires

moi zork
Messages postés
31
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
29 août 2008
-
clair,bien commenté ... genial !
10/10
sploff_splaf
Messages postés
1
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
5 avril 2007
-
Un grand merci pour ce code. Il est clair, facilement réutilisable et modifiable.

10/10
cs_crunch117
Messages postés
7
Date d'inscription
dimanche 22 mai 2005
Statut
Membre
Dernière intervention
16 juillet 2007
-
Pas mal du tout, programme simple, concis, court donc pas besoin de structure exotique.

8/10

@++
Twinuts
Messages postés
5341
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
10 décembre 2019
89 -
Merci ;)

avec la note c'est mieux (huhu)
cs_brodeur
Messages postés
15
Date d'inscription
jeudi 28 février 2002
Statut
Membre
Dernière intervention
28 septembre 2006
-
Super code 10/10. Ca marche nickel sur Linux. Merci, ca faisait un petit moment que je cherchais ce code.

Brodeur

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.