Salve sono nuovo in questo forum è da un po che è ho questo problema , ho il seguente codice per uno sniffer local:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include "inet_structures.h"
#define IFACE "eth0"
//prototipi
int Inet_OpenRawSock(void);
int Inet_SetPromisc(char *iface);
int main() {
int sock, bytes_recieved, fromlen;
char buffer[65535];
char *nameaddress;
struct sockaddr_in from;
struct hostent *site;
IP_Header *ip;
TCP_Header *tcp;
//Creiamo la socket e mettiamola in promiscuo
sock=Inet_SetPromisc(IFACE);
while(1)
{
fromlen = sizeof from;
bytes_recieved = recvfrom(sock, buffer, sizeof(buffer),
0, (struct sockaddr *)&from, &fromlen);
if (bytes_recieved < 0){
printf("sock=%d",sock);
perror("Errore recv");
exit(1);
}
site=gethostbyaddr((const char *)&from.sin_addr.s_addr,sizeof(from.sin_addr.s_addr),AF_INET);
if(!site){
printf("Host address: %s\n",ntohl(from.sin_addr.s_addr));
}else{
printf("Host name: %s\n",site->h_name);
}
ip = (IP_Header *)buffer;
//Guardo se e’ un paccheto TCP
if(ip->proto == 6) {
printf("Lunghezza Header = %d\n",ip->h_len);
printf("Protocollo = %d\n",ip->proto);
printf("Buffer:%s\n",buffer);
tcp = (TCP_Header *)(buffer + (4*ip->h_len));
printf("Porta Sorgente = %d\n",ntohs(tcp->source));
printf("Porta Destinazione = %d\n",ntohs(tcp->dest));
}
}
}
int Inet_OpenRawSock() {
int sock;
if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
perror("Errore creazione socket");
exit(0);
};
return(sock);
}
int Inet_SetPromisc(char *iface) {
int sock;
struct ifreq ifr;
sock = Inet_OpenRawSock();
printf("sock promisc=%d\n",sock);
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
if((ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)) {
perror("Errore Interfaccia\n");
exit(0);
}
printf("Interfaccia: %s\n", iface);
//Setto l’interfaccia in modalita’ promiscua
if (!(ifr.ifr_flags & IFF_PROMISC))
{
ifr.ifr_flags |= IFF_PROMISC;
if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 ){ // promisc mode
perror("Errore non riesco a settare la modalita’ promiscua");
exit(0);
}
}
printf("Interfaccia %s settata in modo promiscuo", iface);
return(sock);
}
Mi da un core dump dove aver eseguito la funzione. Perche?
Grazie in anticipo per le risposte.