La estructura de sockaddr_in

La estructura de sockaddr_in

La programación de socket en el lenguaje C utiliza una variedad de funciones, muchas de ellas se utilizan para resolver, convertir y determinar la dirección del servidor al que queremos conectarnos. Sin lugar a dudas, la dirección IP es la información más importante que necesitamos cuando abrimos un socket. Y tratar con estas direcciones requiere que conozcamos las estructuras en las que están almacenadas, el tipo de datos de cada uno de sus miembros, etc.

En esto Artículo de sugerencia de Linux, Aprenderá todo sobre el tipo de socaddr_in Estructuras utilizadas por las funciones del sistema para almacenar direcciones para conexiones a Internet.

Veremos una descripción teórica de sus miembros y el tipo de datos para cada uno de ellos. Aprenderemos a crear un sockaddr_in estructura y luego recuperar, convertir y almacenar las direcciones en este tipo de estructura para establecer una conexión de socket exitosa.

También explicaremos las similitudes con la estructura SockAddr y cómo convertir datos de uno a otro, ya que este es un paso necesario para usar la función Connect () y conectarse al servidor.

Sintaxis de la estructura Sockaddr_in en lenguaje C

struct Sockaddr_in
sen_family corto;
Unsigned Short sin_port;
struct in_addr sen_addr;
char sin_zero [8];
;

Descripción de la estructura Sockaddr_in en lenguaje C

Estructuras de tipo sockaddr_in están destinados a almacenar la dirección del servidor en conexiones a Internet y ser compatibles en tamaño y orden de datos con una estructura SockAddr utilizada por la función Connect () para conectarse a un servidor.

Los datos almacenados en estas estructuras especifican la familia de direcciones, el número de puerto y la dirección IP del servidor. A continuación, vemos la lista de miembros del sockaddr_in estructura y una descripción de cada miembro:

sin_family: Este es un breve que especifica el tipo de familia de direcciones que contiene la estructura. Estas opciones de familia de direcciones son las siguientes:

AF_INET: Especifica la familia de direcciones IPv4.

AF_INET6: Especifica la familia de direcciones IPv6.

sin_port: es un mina que especifica el número de puerto que usará el socket. Al igual que las direcciones, el número de puerto no está codificado, lo que significa que debe especificarse en formato binario directo, por lo que se debe hacer una conversión a este tipo de datos para asignarle un valor.

in_add: Esta es una estructura cuyo miembro es un uint32_t donde cada uno de sus 4 bytes corresponde a un campo de la dirección IPv4 del servidor de Internet con el que se abrirá el socket. Al igual que el número de puerto, la dirección en esta estructura debe especificarse en formato binario puro.

sin_zero: Esta es una matriz de 8 caracteres cuyo único propósito es equilibrar el tamaño de la estructura con una estructura de tipo sockaddr.

Cómo declarar una estructura de sockaddr_in en el lenguaje C

Para declarar un sockaddr_in estructura, escriba en una línea de código "estructura"Seguido del tipo. En este caso, sockaddr_in Y luego el "nombre de estructura" o "* Nombre de la estructura"Declarar el puntero. La sintaxis para declarar un sockaddr_in La estructura es la siguiente:

struct sockaddr_in *my_struct;

Cómo establecer el número de puerto en una estructura de sockaddr_in en el idioma C

El número de puerto debe especificarse en forma binaria directa en el miembro sen_port de la estructura. Por lo tanto, es necesario convertir el valor a este tipo de datos.

El htons () la función se usa más comúnmente para este propósito. Convierte el valor entero contenido en su argumento de entrada y devuelve su valor en formato binario directo a su salida.

A continuación, veamos cómo asignar el puerto 80 al sin_port Miembro de la estructura declarada anteriormente:

Int Port = 80;
my_struct.sin_port = htons (puerto);

Cómo establecer la dirección IP en una estructura de sockaddr_in en el idioma C

Las direcciones IP no están codificadas, lo que significa que cada uno de los números en sus campos está representado por su equivalente binario. Para trabajar con ellos, en ciertos casos es necesario convertir direcciones IP en cadenas o cadenas a direcciones IP para asignar o consultar estos valores en las estructuras.

El lenguaje C proporciona varias funciones para convertir cadenas en direcciones y almacenar el resultado en ciertas estructuras.

El función inet_pton () es uno de los más utilizados para este propósito. Se define en el encabezado "inet.H"Y tiene tres argumentos de entrada. El primero debe especificar la familia de direcciones para convertir, en este caso AF _inet.

El segundo argumento debe ser el puntero a una cadena que especifica la dirección IP, con cada campo separado por un período.

El tercer argumento de esta función debe ser el puntero a una estructura de tipo sockaddr_in donde se almacena la dirección convertida.

El inet_ntop () La función realiza la tarea inversa, convirtiendo las direcciones almacenadas en un sockaddr_in estructura en cuerdas.

A continuación, veremos cómo asignar una dirección IP a la estructura my_struct del sockaddr_in Escriba desde una cadena, en este caso, utilizando el inet_pton () función. Entonces, usamos el inet_ntop () función para convertir la dirección nuevamente a la IP de cadena para mostrarla en la consola de comando con printf ().

#incluir
#incluir
#incluir
#incluir
vacío principal ()

char ip [inet_addrstrlen] = "";
Char addr [200] = "192.168.1.1 ";
struct sockaddr_in *my_struct;
// Convierte la cadena en dirección.
inet_pton (AF_Inet, addr, & my_struct);
// Convierte la dirección en cadena.
inet_ntop (AF_Inet, & my_struct, ip, inet_addrstrlen);
printf ("\ n \ nip Dirección: %s \ n \ n", ip);

La siguiente imagen muestra la dirección IP que obtuvimos de la cadena addr. Luego, regresamos con la función complementaria inet_ntop () para convertir la dirección almacenada en my_struct en una cadena para mostrarla en la consola de comando.

Cómo determinar la dirección IP de un dominio y almacenarlo en una estructura de sockaddr_in en el idioma C

Para conectarse a un host, primero debe saber su dirección. A continuación, veamos cómo obtener la dirección IP de un host y almacenarla en un sockaddr_in estructura utilizando el gethostByName () función.

Esta función toma como su único argumento de entrada, una cadena, o un puntero, que especifica el nombre de host cuya dirección se debe determinar. Como resultado, gethostByName () Devuelve una estructura de tipo de hostent con todos los datos de dominio, incluida la dirección IP.

Una vez que se recupera la información del host en la estructura hostente, la dirección obtenida se copia al sockaddr_in estructura usando el función bcopy ().

A continuación, vemos el código donde el socaddr_in y las estructuras de tipo hostente se definen. El IP Dirección de "www.Google.comunicarse"Se determina en la última estructura y se copia a la sockaddr_in estructura. Luego, la dirección determinada se convierte en una cadena utilizando el inet_ntoa () y printf () funciones y se muestra en la consola de comando:

#incluir
#incluir
#incluir
#incluir
#incluir
int main ()
struct sockaddr_in my_struct;
struct hostent *host_ent;
host_ent = gethostByName ("www.Google.com ");
bcopy ((char *) host_ent-> h_addr, (char *) & my_struct.sin_addr.s_addr,
sizeof (host_ent-> h_length));
printf ("Dirección IP: %s \ n", inet_ntoa (my_struct.sin_addr));

De esta manera, ya hemos almacenado la dirección de "www.Google.comunicarse"En la estructura del tipo sockaddr_in. La siguiente figura muestra la dirección del host especificada en el argumento de entrada del gethostByName () función.

Google.com tiene múltiples direcciones IP asociadas con el dominio, por lo que el resultado de este código puede diferir del resultado de la imagen.

Cómo lanzar una estructura de SockAddr con los datos de una estructura de sockaddr_in

El conectar() La función es la única función proporcionada por el lenguaje C para establecer conexiones de socket. Esta función utiliza estructuras de tipo sockaddr para especificar la dirección a la que quiere conectarse.

La estructura utilizada por el conectar() la función tiene el mismo tamaño en bytes que una estructura de tipo sockaddr_in pero difiere en el tipo de datos. Esto significa que una estructura elenco debe realizarse para usar los datos de conexión almacenados en el sockaddr_in Estructura en esta función.

Esta simple operación se puede realizar con la misma llamada al Función Connect () En el segundo argumento de entrada, como se muestra a continuación:

conectar (socket, (struct sockaddr *) & my_struct, sizeof (my_struct));

Conclusión

En esto Artículo de sugerencia de Linux, Explicamos todo lo que necesita saber sobre trabajar con estructuras de tipo sockaddr_in. Miramos en detalle el tipo y los datos cada uno de sus miembros.

También le mostramos cómo declarar este tipo de estructura y cómo usar las funciones necesarias para obtener, convertir y manipular los diferentes datos almacenados por cada uno de sus miembros.

Para obtener más artículos sobre el lenguaje C y los consejos de Linux, use el motor de búsqueda en nuestro sitio web.