No se puede leer los paquetes de ARP en C.
Tengo el siguiente código simple para capturar todos los paquetes ARP enviados a mi dispositivo, pero no imprime nada.
include <stdio.h>
include <stdlib.h>
include <unistd.h>
include <string.h>
include <sys socket.h="">
include <sys types.h="">
include <arpa inet.h="">
include <net ethernet.h="">
int main(){
int sock;
char recvbuf[2048];
if((sock=socket(PF_PACKET,SOCK_DGRAM,htons(ETH_P_ARP)))==-1){
perror("socket error");
return -1;
}
for(;;){
if(recvfrom(sock,recvbuf,sizeof(recvbuf),0,NULL,NULL)==-1){
perror("recvfrom error");
}
struct ether_header *e;
e=(struct ether_header *)recvbuf;
printf("arp from :%s\n",e->ether_shost);
}
}
El resultado es como sigue:
arp from :
arp from :
arp from :
arp from :
arp from :</string.h></unistd.h></stdlib.h></stdio.h>
davy.ai
Podría haber múltiples razones por las cuales este código no está imprimiendo nada:
Los paquetes ARP recibidos no son válidos: Verifique el contenido del paquete recibido inspeccionando el búfer
recvbuf
utilizando un depurador. Asegúrese de que el paquete tenga la estructura esperada y que el campoether_shost
no esté vacío.La función
recvfrom()
está devolviendo un error: Verifique el valor de retorno derecvfrom()
e imprima el mensaje de error utilizandoperror()
para investigar el problema. Es posible que el socket no esté inicializado correctamente o que haya un problema con la configuración de red.Una vez que haya identificado la causa raíz del problema, puede modificar el código según corresponda para solucionar el problema.