Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

209
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!