Sample for very simple sniffer.
5951569d7ab4b235187bc84c736d66f36e8a38fa17c233a73a494b2367111a2e
/* this is one */
/* it prints to stdout everything, it sniffes */
#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
static volatile int done;
void handler(int signum)
{
done = 1;
}
int main(int argc, char **argv)
{
char buff[0x10000];
struct ifreq ifr;
int s, n;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <interface>\n", argv[0]);
return 1;
}
s = socket(PF_INET, SOCK_PACKET, htons(0x0003));
if (s == -1)
{
perror("socket");
return 1;
}
strcpy(ifr.ifr_name, argv[1]);
if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
{
perror("ioctl(SIOCGIFFLAGS)");
return 1;
}
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
{
perror("ioctl(SIOCGIFFLAGS)");
return 1;
}
signal(SIGINT, handler);
puts("starting capturing:\n");
fflush(stdout);
for (done = 0; !done; )
{
n = read(s, buff, sizeof(buff));
if ( n!=-1 ) write(STDOUT_FILENO, buff, n);
}
ifr.ifr_flags &= ~IFF_PROMISC;
if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
{
perror("ioctl(SIOCGIFFLAGS)");
return 1;
}
close(s);
printf("Finished\n");
return 0;
}