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