PDA

View Full Version : [C] IP di un device


erbedo
30-11-2006, 15:04
Ciao a tutti
sto cercando di realizzare una specie di sniffer di rete in ambiente GNU/Linux. Avrei bisogno di conoscere l'IP di un device (o potrebbero andare bene anche tutti gli ip di tutti i device di una macchina) all'interno di un programma C.

Ho googlato qua e la, ma ho trovato solo primitive che si riferiscono ai socket, mentre invece io non li uso.

Mi chiedevo allora se esiste un sistema alternativo, appunto tramite interfaccie o syscall o qualsiasi altra cosa, che mi permetta di avere il (gli) IP.

TIA

andbin
30-11-2006, 15:18
sto cercando di realizzare una specie di sniffer di rete in ambiente GNU/Linux. Avrei bisogno di conoscere l'IP di un device (o potrebbero andare bene anche tutti gli ip di tutti i device di una macchina) all'interno di un programma C.

Ho googlato qua e la, ma ho trovato solo primitive che si riferiscono ai socket, mentre invece io non li uso.

Mi chiedevo allora se esiste un sistema alternativo, appunto tramite interfaccie o syscall o qualsiasi altra cosa, che mi permetta di avere il (gli) IP.Non mi è ben chiaro cosa devi fare e come devi ottenere questi IP.

C'è la funzione gethostbyname() che ritorna le informazioni (compreso l'IP o gli IP) di un host partendo dal suo nome.

P.S. comunque se vuoi realizzare uno "sniffer" che possa catturare tutti i pacchetti, la scheda di rete deve essere configurata in "promiscuous mode". E comunque se sei "dietro" uno switch e non un semplice hub, catturi ben poco. :fagiano:

ilsensine
30-11-2006, 15:59
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define NINTERFACES 10

static void __attribute__((noreturn)) fail(const char *s)
{
perror(s);
exit(-1);
}

int main()
{
struct ifreq ifs[NINTERFACES];
struct ifconf iconf;
int x;

int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
if (fd<0)
fail("socket");

memset(ifs, 0, sizeof(ifs));
iconf.ifc_len = sizeof(ifs);
iconf.ifc_req = ifs;

if (ioctl(fd, SIOCGIFCONF, &iconf)<0)
fail("SIOCGIFCONF");
close(fd);

for (x=0; x<NINTERFACES; ++x) {
struct ifreq *i = ifs+x;
union {
struct sockaddr *raw;
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
} addr;

if (i->ifr_name[0]=='\0')
continue;

addr.raw = &i->ifr_addr;

if (addr.raw->sa_family!=AF_INET) {
if (addr.raw->sa_family==AF_INET6)
printf("%s: (ipv6 interface -- use addr.sin6)\n", i->ifr_name);
else
printf("%s: (non-ip interface)\n", i->ifr_name);
continue;
}
printf("%s: %s\n", i->ifr_name, inet_ntoa(addr.sin->sin_addr));
}

return 0;
}