Descripción general:
Cree una aplicación cliente/servidor simple en C utilizando el concepto de programación de sockets . Donde el servidor envía algún mensaje al cliente cuando se conecta.
Cliente:
En esta sección, se define el término ‘Cliente’ y se explica en detalle su flujo de trabajo de socket, a través de diferentes funciones utilizadas para implementar el cliente. Una aplicación que se ejecuta en una computadora personal. Tiene una interfaz de usuario extensa y atractiva, pero no tiene datos que pueda manipular o presentar al usuario. La aplicación del cliente ‘pregunta’ qué quiere un usuario, luego se conecta a la aplicación del servidor para obtener esos datos. Una vez obtenidos los datos, se presentan al usuario en un formato agradable. Un cliente generalmente obtiene los datos de un servidor a la vez e interactúa con un solo usuario.
Flujo de trabajo del cliente:
- La primera parte de cualquier programación de socket es crear el propio socket.
- El socket del cliente se crea con una llamada socket(). La función socket() devuelve un número entero. En la llamada al socket, especificamos los siguientes parámetros
- Dominio: IPv4 (AF_INET)
- Tipo de conector: TCP/UDP (SOCK_STREAM)
- Protocolo: IP (0)
- La conexión a una dirección remota se crea con la llamada connect(). Aquí especificamos la dirección IP y el puerto con el que nos vamos a conectar. Si la conexión es exitosa, se devuelve un valor.
- Los datos se recuperan con una llamada recv(). Los datos recibidos se pueden almacenar en un archivo o en una string.
- La conexión a una dirección remota se crea con la llamada connect(). Aquí especificamos la dirección IP y el puerto con el que nos vamos a conectar. Si la conexión es exitosa, se devuelve un valor.
- Los datos se recuperan con una llamada recv(). Los datos recibidos se pueden almacenar en un archivo o en una string.
Implementación de Código –
C
#include <netinet/in.h> //structure for storing address information #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> //for socket APIs #include <sys/types.h> int main(int argc, char const* argv[]) { int sockD = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(9001); // use some unused port number servAddr.sin_addr.s_addr = INADDR_ANY; int connectStatus = connect(sockD, (struct sockaddr*)&servAddr, sizeof(servAddr)); if (connectStatus == -1) { printf("Error...\n"); } else { char strData[255]; recv(sockD, strData, sizeof(strData), 0); printf("Message: %s\n", strData); } return 0; }
Servidor:
En esta sección, se define el término ‘Servidor’ y se explica en detalle su flujo de trabajo de socket, a través de diferentes funciones utilizadas para implementar el servidor. Una aplicación se ejecuta en una computadora grande (grande significa que tiene un espacio de almacenamiento grande o rápido, o ambos). La aplicación del servidor generalmente está escrita de tal manera que no proporciona ningún método para interactuar con un usuario. En su lugar, espera a que otros programas se conecten. Por lo general, una aplicación de servidor tiene control sobre grandes cantidades de datos y puede acceder a esos datos de manera rápida y eficiente. También puede manejar requests de muchos clientes (más o menos) simultáneamente.
Flujo de trabajo del zócalo del servidor:
- Primero, se creará un socket (similar al programa cliente).
- A continuación, la IP y el puerto del socket se vincularán mediante la función bind() (el cliente utilizó la función connect() para conectarse al servidor; el servidor utilizará la función bind() para escuchar las conexiones).
- Luego se llama a la función listen() para escuchar las conexiones (para ver si algún cliente está intentando conectarse al socket del servidor).
- Se llama a la función accept(). La función devuelve un socket de cliente (el cliente que se ha conectado).
Implementación de Código –
C
#include <netinet/in.h> //structure for storing address information #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> //for socket APIs #include <sys/types.h> int main(int argc, char const* argv[]) { // create server socket similar to what was done in // client program int servSockD = socket(AF_INET, SOCK_STREAM, 0); // string store data to send to client char serMsg[255] = "Message from the server to the " "client \'Hello Client\' "; // define server address struct sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(9001); servAddr.sin_addr.s_addr = INADDR_ANY; // bind socket to the specified IP and port bind(servSockD, (struct sockaddr*)&servAddr, sizeof(servAddr)); // listen for connections listen(servSockD, 1); // integer to hold client socket. int clientSocket = accept(servSockD, NULL, NULL); // send's messages to client socket send(clientSocket, serMsg, sizeof(serMsg), 0); return 0; }
Instrucciones para ejecutar:
- Abra dos terminales en su máquina y compile los programas del servidor y del cliente en diferentes terminales.
- Ejecute primero el programa del servidor y, a continuación, ejecute el programa del cliente.
- Se puede ver que los datos enviados por el servidor se imprimen en el terminal que ejecuta el programa cliente
Referencia: http://pirate.shu.edu/~wachsmut/Teaching/CSAS2214/Virtual/Lectures/lecture17.html