|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2006
Messaggi: 43
|
[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 |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Codice:
#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;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:51.


















