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.