Я пытаюсь написать собственный сниффер пакетов. Я выполняю следующий учебник ...Raw socket не собирает запросы ARP
http://www.binarytides.com/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/
Это, я не могу подобрать ARP запросы пакетов. Я успешно забираю все другие пакеты, включая ICMP, IP и т. Д.
Вот краткий обзор кода. Опять же, я читаю все остальные пакеты (каждый байт каждого другого пакета), но я не читаю ARP.
int main()
{
int saddr_size , data_size;
struct sockaddr saddr;
unsigned char *buffer = (unsigned char *) malloc(65536); //Its Big!
if(logfile==NULL)
{
printf("Unable to create log.txt file.");
}
printf("Starting...\n");
int sock_raw = socket(AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;
setsockopt(sock_raw , SOL_SOCKET , SO_BINDTODEVICE , "eth0" , strlen("eth0")+ 1);
if(sock_raw < 0)
{
perror("Socket Error");
return 1;
}
while(1)
{
saddr_size = sizeof saddr;
//Receive a packet
data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , (socklen_t*)&saddr_size);
if(data_size <0)
{
printf("Recvfrom error , failed to get packets\n");
return 1;
}
//Now process the packet
ProcessPacket(buffer , data_size);
}
close(sock_raw);
printf("Finished");
return 0;
}
Спасибо! Когда я последовал этому учебнику, я внезапно прекратил получать ICMP-пакеты ... Итак, я попробовал гибридный подход и, похоже, работал, и он сохранял PF_PACKET вместо AF_PACKET, но все же использовал recvfrom вместо recv – Matthew