2010-11-27 31 views
2

J'essaie de trouver l'adresse des appareils dans mon ordinateur. Jusqu'à présent, j'ai réussi à obtenir la liste des périphériques (avec pcap_findalldevs) mais je ne peux pas comprendre comment accéder à ces adresses. J'ai vu cette page de manuel - http://www.tcpdump.org/pcap3_man.html où est écrit quelque chose comme ceTrouver l'adresse de l'appareil avec libpcap

adresses un pointeur vers le premier élément d'une liste d'adresses pour l'interface

Et puis ce

Chaque élément de la liste des adresses est de type pcap_addr_t, et a les membres suivants:

J'ai donc ce code

pcap_if_t *alldevsp , *device; 

char *devname , **devs; 
int count = 1 , n; 

if(pcap_findalldevs(&alldevsp, errbuf)) 
{ 
    printf("Error: %s" , errbuf); 
    exit(1); 
} 

device = alldevsp; 
pcap_addr_t list; 
printf("\nDevices:\n"); 
while(device != NULL) 
{ 
    printf("%d. %s - %s", count++ , device->name , device->description); 
    list = device->addresses[0]; 
    printf("address: %s\n",(char *) inet_ntoa(list.addr)); 
    device = device->next; 
} 

La compilation est OK, mais lorsque je tente de l'exécuter i obtenir ceci:

Devices: 1. eth0 - (null) addres: 144.208.30.8 2. wlan0 - (null) addres: 128.213.30.8 Segmentation fault

Je peux comprendre que segfault, parce que le troisième périphérique est usb et il n'a pas d'adresse, mais ceux IP pour eth0 et wlan0 sont faux, ils ne correspondent pas.

Qu'est-ce que je fais mal?

+0

Comment savez-vous que les adresses IP sont erronées? ifconfig? Que faire si vous l'exécutez d'une manière différente: http://stackoverflow.com/questions/4139405/how-to-know-ip-address-for-interfaces-in-c/4139893#4139893 – chrisaycock

+0

Je sais qu'ils ont tort à cause de ifconfig :) En plus de ça, ils changent chaque fois que j'exécute un programme – Pirozek

Répondre

1

De votre lien:

Each element of the list of addresses is of type pcap_addr_t, 
and has the following members: 
    ... 
    addr 
     a pointer to a struct sockaddr containing an address 
    ... 

Maintenant, ce qui est un struct sockaddr? Voir ici: http://www.retran.com/beej/sockaddr_inman.html

Alors, où vous faites ceci:

printf("address: %s\n",(char *) inet_ntoa(list.addr)); 

Vous devriez faire quelque chose comme ceci:

printf("address: %s\n", inet_ntoa(((struct sockaddr_in*)list.addr)->sin_addr)); 

C'est, vous avez besoin d'extraire la "adresse IP" (si en effet la famille est AF_INET), sinon vous donnez inet_ntoa le mauvais type d'argument.

+0

Oui, c'est ce à quoi je faisais allusion quand j'ai dit "si en effet la famille est AF_INET". La famille est bien sûr juste un autre domaine dans le sockaddr. –

+0

On dirait que vous ne pouvez récupérer l'IP de cette façon. Comment obtenez-vous l'adresse mac? – T3rm1

+0

Je voudrais essayer cette approche: http://stackoverflow.com/questions/1779715/how-to-get-mac-address-of-your-machine-using-ac-program pour obtenir l'adresse MAC, une fois que vous avez l'adresse IP. Cela suppose bien sûr que la configuration du système ne change pas entre le temps de capture et le temps d'analyse. –