es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for 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:

    1. Asegúrate de que la interfaz “ens193” es la correcta en la que deseas recibir los paquetes. Puedes verificar el nombre de tu interfaz utilizando el comando “ifconfig”.
    2. Verifica si hay reglas de filtrado establecidas en tu interfaz que puedan evitar que algunos paquetes sean recibidos. Puedes utilizar el comando “tcpdump -i ens193” para ver si se están recibiendo paquetes en la interfaz.
    3. Considera utilizar una herramienta diferente como libpcap para la captura de paquetes, ya que proporciona un nivel de abstracción más alto en comparación con los sockets “raw” y también puede manejar el filtrado de paquetes.
    4. Asegúrate de que tu socket pueda capturar paquetes en modo promiscuo. Puedes habilitar esto agregando la bandera “IFF_PROMISC” a la estructura de dirección del socket antes de vincularlo a la interfaz.

    Al abordar estos puntos, es posible que puedas determinar por qué tu interfaz no está recibiendo paquetes como se esperaba.

Comments are closed.