/*-------------------------------------------------------------*/ /* Exemplo Socket Raw */ /*-------------------------------------------------------------*/ /* Includes */ #include #include #include #include #include #include /* Diretórios: net, netinet, linux contém os includes que descrevem */ /* as estruturas de dados do header dos protocolos */ /* Cuidado: se uitlizar netinet não uitlize o diretório linux e */ /* vice-versa */ #include #include #include #include #if !defined(IPVERSION) #define IPVERSION 4 #endif #define BUFFSIZE 1500 // Atencao!! Confira no /usr/include do seu sisop o nome correto das estruturas de dados // do protocolos. struct icmphdr *icmphdr; struct iphdr *iphdr; unsigned char buff1[BUFFSIZE]; // buffer de recepcao int sockd; struct sockaddr_in mysocket; int iplength; struct iphdr *iphdr_buff, *iphdr_buff1; struct in_addr addr; char tipoicmp[30], ip_origem[16],ip_destino[16]; int main(int argc,char *argv[]) { if((sockd = socket(AF_INET,SOCK_RAW,IPPROTO_IP)) < 0) { perror("socket"); exit(-1); } //use man setsockoptions para conferir as flags necessarias :-) if(setsockopt(sockd,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0){ perror("setsockopt"); exit(-1); } // O procedimento abaixo é utilizado para "setar" a interface em modo promíscuo strcpy(ifr.ifr_name, "eth0"); if(ioctl(sockd, SIOCGIFINDEX, &ifr) < 0) printf("erro no ioctl!"); ioctl(sockd, SIOCGIFFLAGS, &ifr) ifr.ifr_flags |= IFF_PROMISC; ioctl(sockd, SIOCSIFFLAGS, &ifr); while (1) { recv(sockd,(char *)buff1,sizeof(buff1),0x0); } }