Aplicación sencilla cliente/servidor en C

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:

  1. Abra dos terminales en su máquina y compile los programas del servidor y del cliente en diferentes terminales.
  2. Ejecute primero el programa del servidor y, a continuación, ejecute el programa del cliente.
  3. 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 

Publicación traducida automáticamente

Artículo escrito por sam_2200 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *