View Full Version : [C] IP di un device
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
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;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.