En el idioma C, establecer una conexión de cliente cliente a través de un socket requiere varios pasos y funciones. Algunos de estos se utilizan para recuperar datos del servidor al que desea conectarse, otros se utilizan para crear el socket o convertir direcciones.
Aunque no hay un orden en particular, esta serie de pasos y llamadas de función debe hacerse en un orden porque sus resultados se utilizan en los argumentos de entrada de la función posterior.
En esto Pista de Linux artículo, aprenderá cómo usar el conectar() función y crear un socket desde cero para conectarse de forma remota a un servidor.
Comenzamos con una descripción de la sintaxis, los argumentos de entrada y salida que componen esta función y una explicación teórica de cómo funciona. Luego, veremos un ejemplo que muestra un proceso paso a paso sobre cómo crear y conectar un socket.
Dado que el uso de esta función requiere un conocimiento de las estructuras de datos que componen sus argumentos de entrada, en una sección especial analizaremos su composición, el tipo de datos de sus miembros y los parámetros que lo definen en cada uno.
Sintaxis de la función Connect () en lenguaje C
int Connect (int Sockfd, struct Sockaddr *Serv_addr, int Addrlen)Descripción de la función de conexión en el idioma C
La función Connect () establece la conexión de un socket entre un cliente y un servidor.
Esta función conecta el socket, cuyo descriptor es Sockfd, con el servidor y cuya dirección se almacena en la estructura Serv_Addr, que tiene una longitud de Adrlen.
Si la conexión es exitosa, Connect () devuelve 0 como resultado y si la conexión no se pudo establecer, -1.
A continuación se muestra una descripción detallada de cada argumento de entrada y su propósito en la función Connect ().
choque: Este es un entero con el descriptor de socket. Este descriptor es el resultado devuelto por la función Socket () y se utiliza para conectar, enviar y recibir datos desde el servidor.
serv_addr: Este es el puntero a una estructura de tipo SockAddr que almacena la dirección del servidor para conectarse.
actriz: Este es el tamaño del miembro de la matriz sa_data de la estructura sockaddr, donde la dirección, número de puerto, etc. se almacenan.
Pasos antes de llamar a la función Connect () para conectarse a un servidor.
La función de llamada a la función Connect () es la última de una serie de pasos necesarios para establecer una conexión exitosa. Estos pasos consisten en definir las variables y estructuras que utilizarán las funciones: crear un socket y obtener la dirección IP del servidor que queremos conectar, etc. Explicamos en cinco pasos cómo crear un socket y conectarlo a un servidor usando la función Connect ().
Cómo crear, configurar y conectar un zócalo paso a paso desde cero en el idioma C
Paso 1: En el primer paso, incluiremos los siguientes encabezados y definiremos las siguientes variables:
#incluirEl entero Socket_id es el identificador del socket a través del cual se realiza una conexión y a través del cual se envían y reciben datos. La variable puerto Especifica el número de puerto del socket. En este caso 80 para el servicio http y el entero error se usa para detectar errores en las diversas funciones.
Entonces, definiremos el puntero a una estructura de tipo hostent llamado servidor y uno de tipo sockaddr_in llamado cliente. Estas estructuras almacenan información como direcciones IP, tipo de conexión, etc. Los de tipo hostent almacenan la información del servidor, mientras que los de tipo sockadrrr_in almacenar los datos de la conexión. Usamos la función MemCPy () para borrar todos los datos en la estructura hostente.
Struct Hostent *servidor;Paso 2: Una vez que se define la estructura hostente, el siguiente paso es determinar la dirección IP del nombre de host al que queremos conectarnos. Para esto, C proporciona varias funciones que pueden resolver una dirección. En este ejemplo, usaremos gethostByName (). Esta función devuelve un hostent Estructura con los datos del dominio aprobados en el argumento de entrada como una cadena o un puntero. El si La condición romperá la conexión en caso de un error, por ejemplo, un nombre de dominio inexistente.
server_id = gethostByName ("www.Google.com ");Paso 3: Crear un socket sockket_id y obtener su identificador. La función Socket () devuelve el identificador del enchufe creado en función de la familia de direcciones, el tipo y el protocolo de conexión. En este caso, AF _inet, Sock _stream para una conexión IP4 y TCP.
Socket_id = Socket (AF_Inet, Sock_stream, 0);Etapa 4: Establezca la configuración de conexión en el sockaddr_in estructura. Para hacer esto, acceder a sus miembros y asignarles valores para especificar la familia de servicios y direcciones. El número de puerto se especifica en formato binario directo y, por lo tanto, debe convertirse utilizando la función htons ().
En este ejemplo, vamos a establecer AF_INET en el sin_familia campo para direcciones IPv4 y en sin_port Asignamos el puerto 80 para el servicio "HTTP".
cliente.sin_family = AF_Inet;Paso 5: El siguiente paso es copiar la dirección del servidor estructura para el cliente estructura para usar como dirección de conexión para el socket. Una forma de hacerlo es usar la función bcopy () de la siguiente manera:
bcopy ((char *) servidor-> h_addr,Copiar la dirección en la estructura sockaddr, que utiliza la función Connect () como argumento de entrada para serv_addr.
Hacemos esto por un elenco de estructuras y para guardar líneas de código. Haremos esto en la función de llamada a la función Connect () en el argumento de entrada serv_addr.
A continuación, puede ver cómo convertir correctamente la información del cliente estructura:
(struct sockaddr *) y cliente, sizeof (cliente))A continuación, llame a la función Connect () y pase el identificador Socket_id Como el primer argumento. Como el segundo argumento, el sockaddr estructura y finalmente el tamaño de la estructura.
El entero error se pasa como el argumento de entrada, que usamos para verificar si la conexión fue exitosa. El siguiente fragmento muestra cómo llamar a la función Connect () y verificar si fue exitoso:
Error = Connect (Socket_id, (struct Sockaddr *) & Client, sizeof (cliente));La imagen muestra la compilación y ejecución del código donde se conecta al "www.Google.com "servidor. Este código establece la conexión y luego cierra la aplicación desconectando.
El siguiente fragmento usa las funciones fgets () para ingresar cadenas a través de la consola de comando y las funciones send () y recv () para enviar comandos HTTP al servidor y recibir la respuesta:
mientras (1)La imagen que vemos a continuación muestra la ejecución del código completo con el envío del comando http "get" y la respuesta del servidor:
La estructura de sockaddr_in
Estructuras de tipo sockaddr_in Almacene la configuración del tipo de conexión y la dirección. Sus miembros se utilizan para especificar la familia, la dirección a usar y el número de puerto.
A continuación, puede ver este tipo de estructura junto con una lista detallada de cada miembro:
struct sockaddr_insin_familia: Este entero especifica una de las opciones familiares que el servidor debe devolver. Las opciones de la familia de las direcciones son:
AF_INET para direcciones IPv4.
AF_INET6 para direcciones IPv6.
sin_port: Establece el número de puerto del servicio para usar.
sin_addr: Esta es la abreviatura de la dirección de Internet. Esta es una estructura de tipo en_addr donde se almacena la dirección de Internet.
sin_zero: Esta es una matriz de 8 caracteres sin firmar con el valor 0, que sirve como relleno para compensar el tamaño de 14 bytes de la estructura Sockaddr.
La estructura hostente
Este tipo de estructura almacena datos útiles proporcionados por el servidor cuando se realiza una consulta con funciones como GethostBynam (). Estas preperias de conexión de socket se resuelven direcciones e información de devolución, como el nombre de dominio, la familia de direcciones y una lista de direcciones si existe más de una. A continuación puede ver esta estructura junto con una descripción detallada de cada elemento:
estructura hostenteH_NAME: Este es un puntero a una cadena con el nombre de dominio para el cual fue consultado.
H_Aliases: Esta es una lista de nombres alternativos.
H_addrtype: Este miembro especifica la familia de direcciones para la que fue consultado.
h_length: Esto especifica el tamaño de la dirección.
h_addr_list: Este es el puntero a una lista de punteros de dirección. Si el servidor devuelve más de una dirección para el nombre consultado, se accede a cada uno a través de este puntero de la lista.
H_addr : Esta estructura define H_addr como un puntero a la primera dirección en el h_addr_list, Entonces el acceso es a través de esta definición.
Conclusión
En esto Pista de Linux Artículo, explicamos todo sobre el conectar() función en el lenguaje C.
Observamos la sintaxis de esta función, así como los tipos de argumentos y estructuras que utiliza en sus entradas. Además, hemos explicado paso a paso cómo crear un socket y conectarse a un servidor remoto utilizando esta función.
Para que tenga un conocimiento más profundo de los enchufes en este idioma, hemos creado una sección especial que explica las estructuras utilizadas por las funciones de socket, que detalla a cada uno de sus miembros la función que realizan en los argumentos de entrada de las diferentes funciones.