2014-11-25 2 views
0

사용자 지정 패킷 스니퍼를 쓰려고합니다. 내가 원시 소켓이 ARP 요청을받지 않음

http://www.binarytides.com/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/

은 이렇게 ... 다음 자습서를 따라하고, 나는 ARP 패킷을 요청 받아 드릴 수 없습니다. 나는 ICMP, IP 등을 포함한 다른 모든 패킷을 성공적으로 픽업한다.

다음은 코드의 개요이다. 다시, 다른 모든 패킷 (모든 다른 패킷의 모든 바이트)을 읽고 있지만 ARP를 읽지는 않습니다. 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

당신은 recv를 사용해야합니다, 당신은 recvfrom을 사용할 수 없습니다, IP 패킷을 사용하지 않습니다.

this example.

+0

감사합니다. 그 튜토리얼을 따라했을 때, 갑자기 나는 ICMP 패킷을 수신하지 못했습니다 ... 그래서 나는 하이브리드 접근 방식을 시도하고 작동하는 것, 그리고 그것은 AF_PACKET 대신 PF_PACKET을 유지하지만 여전히 recvfrom 대신 recv를 사용하고 있습니다. – Matthew

관련 문제