1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include <sys/ioctl.h> // pour ioctl
#include <sys/socket.h> // pour socket
#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 <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <errno.h> // pour errno
int main()
{
// ------- Delarations -------------------------------
int descSock,sk,addr_in_size; //numero du socket cree
int port;
int i = 0;
struct ifreq devea;
struct sockaddr_in *sa; // structure socket
struct if_nameindex *nameindex = if_nameindex();
memset(&sa, 0, sizeof(struct sockaddr_in)); // Efface proprement lespace memoire
memset(&devea, 0, sizeof(struct ifreq)); // Efface proprement lespace memoire
addr_in_size = sizeof(struct sockaddr_in);
sa = (struct sockaddr_in *)malloc(addr_in_size);
memset((char *)sa,(char)0,addr_in_size);
//on ouvre un socket
descSock=socket(AF_INET,SOCK_DGRAM,0);
sa->sin_family = AF_INET;
sa->sin_port = htons(1205); //port libre quelconque
sa->sin_addr.s_addr = inet_addr("10.64.114.19"); //adresse a lier
if (descSock < 0 )
{
perror("socket ");
//On relache le pointeur dynamiquement alloue par if_nameindex
printf("\nDesole, je ne peux pas creer la socket\n");
if_freenameindex(nameindex);
return errno;
}
else
{
printf("Creation du socket -%d- : OK \n",i);
if (bind(descSock,(struct sockaddr*)sa,addr_in_size) == -1)
{
perror("Erreur ");
close(descSock);
}
else
{
//récupération d'un pointeur sur toutes les cartes disponible;
if(nameindex == NULL)
{
perror("if_nameindex ");
printf("Aucune carte trouvee \n");
return errno;
}
while(nameindex[i].if_name != NULL)//il n'y a plus de cates on sort
{
//Copie du nom dans la structure ifreq
// preparation de l'index pour la prochaine carte
strcpy(devea.ifr_name, nameindex[i++].if_name);
printf("Reseau : %s\n", devea.ifr_name); //Affichage de celui-ci
sk=socket(AF_INET,SOCK_DGRAM,0);
//Récupération de la MAC adresse
printf("\tMAC\t:\t");
if (ioctl(sk,SIOCGIFHWADDR, &devea) < 0)
{printf("ERROR\n");
perror("erreur");
}
else
{
//Affichage l'adresse MAC
printf("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\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(sk);
printf("Fermeture du socket %d : OK \n\n",i);
}
if(i == 0) printf("Aucune carte disponible !!!\n");
if_freenameindex(nameindex);//libere memoire
}
}
close(descSock);
return 0;
} |
Partager