2014-11-25 2 views
0

Я пытаюсь написать собственный сниффер пакетов. Я выполняю следующий учебник ...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; 
} 

ответ

1

Как ARP не использует IP-пакеты, вы не можете использовать recvfrom, вы должны использовать recv.

См., Например, this example.

+0

Спасибо! Когда я последовал этому учебнику, я внезапно прекратил получать ICMP-пакеты ... Итак, я попробовал гибридный подход и, похоже, работал, и он сохранял PF_PACKET вместо AF_PACKET, но все же использовал recvfrom вместо recv – Matthew

 Смежные вопросы

  • Нет связанных вопросов^_^