Cześć,
Chciałbym się podpiąć do interfejsu sieciowego (np. eth0) i zczytać z niego dane. Nie chcę się podpinać pod jakiś konkretny port jak przy tworzeniu serwera ani czytać wszystkiego, co tylko doleci do NIC-a (jak w trybie promiscous). Chcę widzieć wszystkie dane, jakie przechodzą przez interfejs (i są dla mojego hosta przeznaczone).
Nie jestem linuxowym ekspertem (właściwie to dopiero zaczynam). Przypuszczam, że powinienem znaleźć jakiś deskryptor pliku, z którym interfejs jest skojarzony, ale nie mam najmniejszego pojęcia jak go uzyskać, a cały dzień googlowania przyniósł raczej mierne rezultaty.
Właściwie to nie korzystam z eth0, ale z wirtualnych interfejsów tun/tap. Chciałem zrobić coś w oparciu o przykłady, jakie prezentują twórcy (konkretnie:
http://tun.sourcearchive.com/documentation/1.1/br__select_8c-source.html). Ich przykład powinien tworzyć most między dwoma interfejsami tun/tap, ale chyba jest skopany (chociażby dlatego, że w katalogu /dev/ nie tworzą się interfejsy).
W katalogu /dev/net/ jest urządzenie tun, które wykorzystuję do tworzenia i konfigurowania interfejsu
Poniższy kod niestety blokuje się na select() zamiast wypisać to, co przyszło do interfejsu (np. gdy pinguję go)
struct ifreq ifr;
int f1, l;
fd_set fds;
char buf[1600];
sprintf(tun,"/dev/net/tun");
f1 = open(tun, O_RDWR);
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags=IFF_TUN;
strcpy(ifr.ifr_name, "tun%d");
//create tun interface
if ( ioctl(f1, TUNSETIFF, (void*)&ifr) != 0)
{
close(f1);
err(1, "configuring /dev/net/tun");
}
//...ustawienie adresu IP i podniesienie interfejsu...
while(1)
FD_ZERO(&fds); //czyścimy zbiór deskryptorów
FD_SET(f1, &fds); //dodajemy do tego zbioru deskryptor opisujący tun
ret = select(f1+1, &fds, NULL, NULL, NULL);
if( FD_ISSET(f1, &fds) )
{
l = read(f1,buf,sizeof(buf));
sprintf(buf,"%s\\0",buf);
printf ("%s",buf);
}
}
Tak więc: wyciągnąć dane przechodzące przez interfejs?