Socket Unix - Estructuras

Se utilizan varias estructuras en la programación de sockets de Unix para contener información sobre la dirección y el puerto, y otra información. La mayoría de las funciones de socket requieren un puntero a una estructura de dirección de socket como argumento. Las estructuras definidas en este capítulo están relacionadas con la familia de protocolos de Internet.

sockaddr

La primera estructura es sockaddr que contiene la información del socket:

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

Esta es una estructura de dirección de socket genérica, que se pasará en la mayoría de las llamadas a funciones de socket. La siguiente tabla proporciona una descripción de los campos de miembros:

Atributo Valores Descripción
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Representa una familia de direcciones. En la mayoría de las aplicaciones basadas en Internet, usamos AF_INET.
sa_data Dirección específica del protocolo El contenido de los 14 bytes de la dirección específica del protocolo se interpreta de acuerdo con el tipo de dirección. Para la familia de Internet, usaremos la dirección IP del número de puerto, que está representada por la estructura sockaddr_in definida a continuación.

sockaddr en

La segunda estructura que le ayuda a hacer referencia a los elementos del socket es la siguiente:

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

Aquí está la descripción de los campos de miembros:

Atributo Valores Descripción
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Representa una familia de direcciones. En la mayoría de las aplicaciones basadas en Internet, usamos AF_INET.
sin_port Puerto de servicio Un número de puerto de 16 bits en orden de bytes de red.
sin_addr Dirección IP Una dirección IP de 32 bits en orden de bytes de red.
sin_zero No utilizado Simplemente establezca este valor en NULL ya que no se está utilizando.

en addr

Esta estructura se usa solo en la estructura anterior como un campo de estructura y contiene netid / hostid de 32 bits.

struct in_addr {
   unsigned long s_addr;
};

Aquí está la descripción de los campos de miembros:

Atributo Valores Descripción
s_addr Puerto de servicio Una dirección IP de 32 bits en orden de bytes de red.

hostent

Esta estructura se utiliza para mantener la información relacionada con el host.

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

Aquí está la descripción de los campos de miembros:

Atributo Valores Descripción
h_name ti.com etc. Es el nombre oficial del anfitrión. Por ejemplo, tutorialspoint.com, google.com, etc.
h_aliases TI Contiene una lista de alias de nombres de host.
h_addrtype AF_INET Contiene la familia de direcciones y, en el caso de una aplicación basada en Internet, siempre será AF_INET.
h_length 4 Tiene la longitud de la dirección IP, que es 4 para la dirección de Internet.
h_addr_list in_addr Para las direcciones de Internet, la matriz de punteros h_addr_list [0], h_addr_list [1], etc., son puntos para estructurar in_addr.

NOTE - h_addr se define como h_addr_list [0] para mantener la compatibilidad con versiones anteriores.

sirviente

Esta estructura particular se utiliza para mantener la información relacionada con el servicio y los puertos asociados.

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

Aquí está la descripción de los campos de miembros:

Atributo Valores Descripción
nombre de http Este es el nombre oficial del servicio. Por ejemplo, SMTP, FTP POP3, etc.
s_aliases ALIAS Contiene la lista de alias de servicio. La mayoría de las veces, se establecerá en NULL.
deporte 80 Tendrá número de puerto asociado. Por ejemplo, para HTTP, será 80.
s_proto

TCP

UDP

Está configurado según el protocolo utilizado. Los servicios de Internet se proporcionan mediante TCP o UDP.

Consejos sobre estructuras de enchufes

Las estructuras de direcciones de socket son una parte integral de cada programa de red. Los asignamos, los completamos y les pasamos punteros a varias funciones de socket. A veces pasamos un puntero a una de estas estructuras a una función de socket y completa el contenido.

Siempre pasamos estas estructuras por referencia (es decir, pasamos un puntero a la estructura, no a la estructura en sí), y siempre pasamos el tamaño de la estructura como otro argumento.

Cuando una función de socket completa una estructura, la longitud también se pasa por referencia, de modo que la función pueda actualizar su valor. A estos los llamamos argumentos valor-resultado.

Siempre, establezca las variables de estructura en NULL (es decir, '\ 0') usando memset () para las funciones bzero (), de lo contrario, puede obtener valores basura inesperados en su estructura.