Recibiendo paquetes a través de socket raw
Estoy intentando recibir paquetes Ethernet a través de un socket RAW. Pero el comportamiento no es el esperado.
El código está aquí.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <net ethernet.h="">
#include <linux if_packet.h="">
#include <arpa inet.h="">
#include <sys socket.h="">
#include <sys time.h="">
#include <sys select.h="">
int32_t main(int32_t argc, int8_t *argv[])
{
int32_t sock;
int8_t buf[1522];
int32_t ret;
int32_t bytes;
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sock == -1)
{
printf("fallo al abrir el socket\n");
return 1;
}
ret = setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "ens193", (strlen("ens193")+1));
if (ret == -1)
{
printf("fallo la asociación de la interfaz\n");
close(sock);
return 1;
}
while(1)
{
bytes = recvfrom(sock, buf, 1522, 0, NULL, NULL);
if (bytes < 0)
{
printf("error en recvfrom\n");
exit;
}
printf("bytes = %d\n", bytes);
}
close(sock);
return 0;
}
Y la salida de ejecución está aquí.
./a.out
[Nada sucede por un rato]
bytes = 60
bytes = 42
bytes = 134
bytes = 118
bytes = 118
bytes = 118
bytes = 118
bytes = 118
bytes = 118
bytes = 66
...
...
...
Pero creo que la interfaz en realidad no está recibiendo ningún paquete. Si veo la salida de ifconfig, el contador RX no está aumentando. ¿Es porque estoy perdiendo algo en mi código? Si tienes alguna buena idea, ¡por favor hazme saber!</errno.h></unistd.h></stdint.h></string.h></stdlib.h></stdio.h>
davy.ai
Como experto en tecnología de la información especializado en C, Linux, Ethernet y sockets “raw”, me gustaría sugerir lo siguiente:
Al abordar estos puntos, es posible que puedas determinar por qué tu interfaz no está recibiendo paquetes como se esperaba.