Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

IP,MASK,MAC SOUS LINUX


Information sur la source

Catégorie :Réseaux & Internet Classé sous : linux, ip, masque, mac Niveau : Débutant Date de création : 10/08/2006 Date de mise à jour : 11/08/2006 10:03:50 Vu : 5 916

Note :
9,5 / 10 - par 4 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

Description

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

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

Historique

11 août 2006 10:03:50 :
Correction des accents

Commentaires et avis

signaler à un administrateur
Commentaire de brodeur le 28/09/2006 08:42:34

Super code 10/10. Ca marche nickel sur Linux. Merci, ca faisait un petit moment que je cherchais ce code.

Brodeur

signaler à un administrateur
Commentaire de Twinuts le 28/09/2006 09:08:00 administrateur CS

Merci ;)

avec la note c'est mieux (huhu)

signaler à un administrateur
Commentaire de crunch117 le 25/10/2006 18:36:00

Pas mal du tout, programme simple, concis, court donc pas besoin de structure exotique.

8/10

@++

signaler à un administrateur
Commentaire de sploff_splaf le 05/04/2007 23:31:05

Un grand merci pour ce code. Il est clair, facilement réutilisable et modifiable.

10/10

signaler à un administrateur
Commentaire de moi zork le 29/08/2008 23:53:41 10/10

clair,bien commenté ... genial !
10/10

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

TCP/IP [C++ Linux G++] Pas encore poste (?) [ par Niko2012 ] Bon, je suis en train de m'initier au tcp/ip sous linux et j'en bave...je recherche:-de bon tutoriels (si vous en connaissez en francais c mieux)-des Masque de saisie sous C++ Buider 6 [ par ivdz ] Bonjour,Comment générer le masque de saisie d'une adresse IP. J'ai créé un TMaskEdit *TMEpuis j'ai fait TME-&gt;EditMask="000.000.000.000"Cela marche obtenir son ip (linux) [ par Anacr0x ] Comme le dit le titre, je cherche a obtenir l'IP de mon ordi sous linux (si possible avec QT ca sympa, mais je rêve pas trop)Je rencontre pas mal de d IP adresses, handover, linux [ par alex1982 ] Bonjour,Je suis actuellement ent train de r&#233;aliser un prototype, afin de simuler l'int&#233;gration de MIP au sein d'IMS...Mais ma question est p [langage c] incrémentation d'une ip sous linux [ par azurone ] [alors voilà je reçoit une ip au format xxx.xxx.xxx.xxxdepuis un char*argc[]j'aimerais savoir comment l'incrémenterje souhaite faire un scanner de pla chat TCP/IP sous linux avec C [ par hassanamigos ] bonsoir tous le monde, al&#233; aidez moi je vous en prie!HELP MEs'il vous pailt j&#233; besion d'aide j&#233; 12 projet sur le chat CLIENT/SERVEUR (T [Linux] Obtenir l'adresse IP Local [C] [ par ZedMaTrix ] Hello à tous !! Voilà, il me semble que j'avais posté, je sais plus ( je retrouve plus le poste )... <img src="http://www.sited Recuperation d'adresse IP sous LINUX FEDORA [ par diablo31170 ] Salut &#224; tous, J'ai cherch&#233; et je n'ai pas trouver un programme ( j'en ai trouv&#233; et ils ne marchent pas) qui permet de R&#233;cuperer e Obtenir l'adresse MAC d'une IP [ par metos ] Bonjour à tous,     J'ai une adresse IP, et je souhaiterais obtenir l'adresse MAC. Comment peut-on le faire en C?Merci d'avancemetos Compiler un programme sous linux / Mac [ par maxwells ] Bonjour à tous,l'année dernière j'ai repris les sources d'un tétris en SDL et je l'ai arrangé. J'ai ajouté la possibilité de pouvoir jouer avec ses pr


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.