GoRiX blog

A blog about things

127.1 es igual que 127.0.0.1?? WTF

May 21, 2024 — n4ch0m4n

Cuando trabajamos con direcciones IP y leemos alguna que otra documentación nos encontramos con algunos detalles técnicos fascinantes que simplifican nuestras vidas.

Aunque siendo sincero jamás lo había visto hasta que un profesor me lo mostró y es la capacidad de abreviar direcciones IP.

Viste alguna vez y por qué 127.1 es lo mismo que 127.0.0.1? Ni idea no?

La respuesta se encuentra en la función inet_aton y su manejo inteligente de las direcciones IP.

Qué es inet_aton?

Es una función en la biblioteca de sockets de sistemas Unix y compatibles, como Linux. Su propósito principal es convertir direcciones IP en notación de punto decimal a un formato binario que el sistema puede usar internamente. Esta función es crucial para aplicaciones de red que necesitan interpretar y manejar direcciones IP de forma eficiente.


Sintaxis de inet_aton

#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
  • cp: Un puntero a una cadena de caracteres que contiene la dirección IP en notación de punto decimal.
  • inp: Un puntero a una estructura in_addr donde se almacenará la dirección IP convertida.

Soporte para Notación Abreviada

Una de las características más interesantes de inet_aton es su soporte para notaciones abreviadas de direcciones IP.

Esto significa que puedes omitir algunos de los octetos (grupos de 8 bits) en una dirección IP, y la función completará automáticamente los ceros faltantes.

Formas de Notación

  • Notación Completa: a.b.c.d
  • Tres Octetos: a.b.c (el cuarto octeto se asume como 0)
  • Dos Octetos: a.b (los últimos dos octetos se asumen como 0)
  • Un Octeto: a (los últimos tres octetos se asumen como 0)

Ejemplo:

127.1 se interpretará como 127.0.0.1

192.168 se interpretará como 192.168.0.0

10 se interpretará como 10.0.0.0

Como funca ?

Cuando pasás una dirección abreviada como 127.1 a inet_aton, la función realiza los siguientes pasos:

  1. Entrada: Recibe la cadena 127.1
  2. Interpretación: La función detecta que faltan octetos y los completa con ceros
  3. Expansión: La dirección se expande a 127.0.0.1
  4. Conversión: Finalmente, convierte la dirección expandida a un formato binario en la estructura in_addr

Ejemplo Práctico

#include <stdio.h>
#include <arpa/inet.h>
int main() {
  const char *ip_str = "127.1";
  struct in_addr ip_addr;
  if (inet_aton(ip_str, &ip_addr)) {
      printf("La dirección es: %s\n", inet_ntoa(ip_addr));
  } else {
      printf("Dirección IP inválida.\n");
  }
  return 0;
}

En este código, inet_aton convierte la cadena 127.1 en la estructura in_addr correspondiente a 127.0.0.1, y luego se imprime la dirección expandida usando inet_ntoa.

Desde luego podés probar otras alternativas, como 192.1, 10.2.8, etc...El resultado de este código siempre será el mismo que si hacés un ping a la ip abreviada.

Concluyendo.....

La función inet_aton no solo facilita la conversión de direcciones IP a un formato binario, sino que también simplifica un poco la vida permitiendo el uso de notaciones abreviadas. Este pequeño truco de completado automático de ceros es una de esas características que, aunque puedan parecer menores, tienen un gran impacto en la eficiencia y simplicidad del desarrollo de software de red aunque no lo parezca.

Así que la próxima vez que veas una dirección como 127.1, sabrás que es simplemente una forma abreviada de 127.0.0.1, gracias a inet_aton.

Fuente: inet_aton(3): Internet address change routines - Linux man page

Tags: Redes