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:
s_addr ?CLASS_C_NETMASK , CLASS_B_NETMASK , etc., que serían más apropiadas que usar máscaras generadas manualmente (es decir, 0xFF000000 , 0x00FF0000 , etc.)?Gracias.
¿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.