Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

207
Vistas
Manera estándar/segura de verificar si la dirección IP está dentro del rango/subred

Tengo un pequeño fragmento de código que convierte un entero sin signo de 32 bits (es decir, uint32_t ) en un conjunto de cuatro campos de 8 bits, lo trata como una dirección IP y luego informa al cliente si se encuentra dentro de un rango predeterminado. de direcciones IP.

Ya encontré algunos ejemplos diferentes de código en C que me muestran cómo obtener la dirección IP de un cliente de la struct sockaddr_in que la contiene, junto con una respuesta C# . Sin embargo, me gustaría desglosar un poco más la dirección, mantenerla en C puro y quería saber algunas cosas rápidas:

  1. ¿La representación interna es consistente de un sistema a otro, o alguna vez necesito hacer verificaciones/correcciones de Endian-ness en el campo s_addr ?
  2. ¿Existen macros estándar como CLASS_C_NETMASK , CLASS_B_NETMASK , etc., que serían más apropiadas que usar máscaras generadas manualmente (es decir, 0xFF000000 , 0x00FF0000 , etc.)?
  3. ¿Hay alguna función existente en la biblioteca de sockets que verifique si una dirección IP está en un rango de direcciones IP o coincide con una máscara de subred?

Gracias.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿La representación interna es consistente de un sistema a otro, o alguna vez necesito hacer verificaciones/correcciones de Endian-ness en el campo s_addr?

s_addr siempre está en orden de bytes de red (big endian) en todas las plataformas.

¿Existen macros estándar como CLASS_C_NETMASK, CLASS_B_NETMASK, etc., que serían más apropiadas que usar máscaras generadas manualmente (es decir, 0xFF000000, 0x00FF0000, etc.)?

No, tampoco tendría sentido usar este tipo de macros, ya que las máscaras de subred no son fijas de una red a otra. Debe proporcionar su código con una IP de red real y su máscara de subred (preguntar al usuario, consultar el sistema operativo, etc.). A continuación, puede calcular las direcciones IP iniciales y finales de la subred para compararlas con su dirección IP de destino:

 uint32_t ip = ...; // value to check uint32_t netip = ...; // network ip to compare with uint32_t netmask = ...; // network ip subnet mask uint32_t netstart = (netip & netmask); // first ip in subnet uint32_t netend = (netstart | ~netmask); // last ip in subnet if ((ip >= netstart) && (ip <= netend)) // is in subnet range... else // not in subnet range...

O más simple, enmascare tanto la IP de red como la IP de destino con la máscara de subred y vea si los valores resultantes son los mismos (es decir, son la misma subred):

 uint32_t ip = ...; // value to check uint32_t netip = ...; // network ip to compare with uint32_t netmask = ...; // network ip subnet mask if ((netip & netmask) == (ip & netmask)) // is on same subnet... else // not on same subnet...

¿Hay alguna función existente en la biblioteca de sockets que verifique si una dirección IP está en un rango de direcciones IP o coincide con una máscara de subred?

No. Pero es trivial implementarlo manualmente, solo se necesitan unas pocas líneas de código, como se muestra arriba.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda