Необработанный сокет не принимает запросы ARP

0

Я пытаюсь написать собственный сниффер пакетов. Я следую следующему руководству...

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;
}
Теги:
sockets
packet

1 ответ

1
Лучший ответ

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

См. Например, этот пример.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню