En este tutorial,
explicaré cómo la comunicación servidor-cliente utiliza TCP/IP. Ya expliqué sobre socket y cómo crear socket en Linux . Antes de la explicación, veamos una descripción básica de la terminología.
Se necesitan tres cosas principales para establecer la conexión entre los modelos servidor-cliente:
1) Protocolo de transporte (TCP o UDP)
2) Zócalo
3) dirección IP y puerto
Protocolo de transporte (TCP):
TCP es un protocolo orientado a conexión que significa protocolo de control de transferencia. Es un protocolo confiable y seguro. En TCP, el receptor puede generar una confirmación del paquete recibido, por lo que el remitente (cliente) necesita esperar una confirmación y si la respuesta no llega o se genera algún error en el paquete, se reenviará al cliente.
Enchufe:
Socket es una conexión de punto final para la comunicación entre dos máquinas. Es como una ruta de conectividad de datos entre dos terminales inalámbricos. El socket es necesario tanto en el lado del servidor como en el del cliente. Puede consultar el tutorial
de sockets y
Cómo crear sockets en Linux .
dirección IP y puerto
La dirección IP es una dirección numérica única para cada computadora y dispositivo. Desempeña un papel importante en el dominio de la red del Protocolo de Internet. En el modelo servidor-cliente, el servidor necesita saber qué dispositivo está conectado y con quién establece la conexión. La dirección IP juega un papel importante en la comunicación entre los modelos servidor-cliente.
En términos de red, el puerto es el lugar donde se envía la información. Varios protocolos asignan diferentes números de puerto. Se requiere un número de puerto específico para la comunicación servidor-cliente según el protocolo utilizado.
Veamos cómo obtener la dirección IP del usuario. Ingrese el siguiente comando en la terminal de comandos:
ifconfig
Muestra información de la red como dirección, paquete de datos, etc. Asegúrese de qué tipo de conexión a Internet hay en su sistema.
La dirección IP del sistema se encuentra mediante
“ dirección inet ” . Es la dirección IP de su sistema.
Por ejemplo, dirección de Internet: xxx.xx.xx.xx
Aquí, x representa el valor numérico.
Servidor – Comunicación con el cliente mediante TCP/IP
El modelo servidor-cliente es el modelo de comunicación para compartir el recurso y brindar el servicio a diferentes máquinas. El servidor es el sistema principal que proporciona recursos y diferentes tipos de servicios cuando el cliente solicita utilizarlo.
Veamos, la comunicación servidor-cliente mediante programación de sockets mediante TCP/IP. Pensé que conocías la programación básica en C y el socket. Consulte el tutorial
de socket y
Cómo crear socket en Linux antes de aprender este tutorial .
Comunicación servidor-cliente mediante TCP/IP
Las siguientes tareas se realizan en el lado del cliente:
• Crear un socket para la comunicación
• Configurar el protocolo TCP con la dirección IP del servidor y el número de puerto
• Conexión al servidor mediante socket
• Espere la confirmación del servidor
• Enviar mensaje al servidor
• Recibir mensaje del servidor
Las siguientes tareas se realizan en el lado del servidor:
• Crear un socket para la comunicación
• Vincular el puerto local y la dirección de conexión
• Configurar el protocolo TCP con número de puerto
• Escuche la conexión del cliente
• Aceptar la conexión del cliente
• Enviar confirmación
• Recibir mensaje del cliente
• Enviar mensaje al cliente
Aquí escribí dos programas individuales, uno para el lado del servidor y otro para el lado del cliente. Necesitamos un ordenador con entorno Linux. Pero no se preocupe; Puedes comunicarte con un solo sistema.
Programa del lado del cliente:
//*********************************TCP_client.c************ **********************//
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int principal
{
char enviarMensaje(512),recibirMensaje(512);
calcetín interior, resultado;
estructura de alojamiento *host;
estructura sockaddr_in serverAdd;
host = gethostbyname(“xxx.xx.xx.xx”);
si ((calcetín = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“Error al crear el socket”);
salida(1);
}
serverAdd.sin_family = AF_INET;
serverAdd.sin_port=htons(5000);
serverAdd.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serverAdd.sin_zero),8);
if (connect(sock, (struct sockaddr *)&serverAdd, sizeof(struct sockaddr)) == -1)
{
perror(“Error de conexión”);
salida(1);
}
mientras(1)
{
resultado = recv(sock,receberMessage,1024,0);
recibirMensaje(resultado) = ”;
printf(“nMensaje recibido: %s”, recibirMensaje);
printf(“nENVIAR mensaje: “);
fgets(enviarMensaje,512,stdin);
enviar(calcetín,enviarMensaje,strlen(enviarMensaje), 0);
}
devolver 0;
}
//*********************************TCP_client.c************ **********************//
Programa del lado del servidor:
//*********************************TCP_server.c************ *******************//
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int principal
{
char enviarMensaje(1024), recibirMensaje(1024);
int calcetín, conectado, resultado;
estructura sockaddr_in serverAdd, clientAdd;
longitud interna;
si ((calcetín = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“Error al crear el socket”);
salida(1);
}
si (setsockopt(calcetín,SOL_SOCKET,SO_REUSEADDR,&1,tamaño(int)) == -1)
{
perror(“Establecer opción de socket”);
salida(1);
}
serverAdd.sin_family = AF_INET;
serverAdd.sin_port=htons(5000);
serverAdd.sin_addr.s_addr=INADDR_ANY;
bzero(&(serverAdd.sin_zero),8);
si (bind(sock, (struct sockaddr *)&serverAdd, sizeof(struct sockaddr))== -1)
{
perror(“No se puede vincular”);
salida(1);
}
si (escucha (mitad, 3) == -1)
{
perror(“Escucha”);
salida(1);
}
printf(“TCPServer esperando conexión del cliente”);
enjuague (salida estándar);
mientras(1)
{
longitud = tamaño de (struct sockaddr_in);
conectado = aceptar(sock,(struct sockaddr *)&clientAdd,&length);
printf(“El servidor está conectado con la dirección IP %s y el puerto %dn”,inet_ntoa(clientAdd.sin_addr),ntohs(clientAdd.sin_port));
mientras (1)
{
printf(" ENVIAR mensaje: ");
fgets(enviarMensaje,100,stdin);
enviar(conectado, enviarMensaje, strlen(enviarMensaje), 0);
resultado = recv(conectado,recibirMensaje,512,0);
recibirMensaje(resultado) = ”;
printf(“Mensaje recibido: %sn”, recibirMensaje);
enjuague (salida estándar);
}
}
devolver 0;
}
//*********************************TCP_server.c************ *******************//
Guarde el archivo en el directorio y compílelo. Después de una compilación exitosa, ejecute el archivo ejecutable en la terminal de comandos. Puede consultar el tutorial Cómo crear el primer programa C en Linux si no conoce el proceso de compilación y ejecución.
Nota: Escriba la dirección IP de su servidor en lugar de "xxx.xxx.xx.xx". en el programa del lado del cliente .
Ejecute el programa servidor – cliente en el mismo sistema
Puede ejecutar el programa cliente-servidor en la misma máquina. Primero busque la dirección IP de su PC cliente como lo describí anteriormente. Ahora, si desea ejecutar en la misma PC, se inserta la misma IP en el código fuente del cliente. Guarde el código fuente del servidor y del cliente en la misma PC.
Abra la terminal de comandos y ejecute el primer archivo ejecutable del servidor. El código del lado del servidor está en modo de ejecución. No interrumpas el código. Abra otra terminal de comando y ejecute el archivo ejecutable del lado del cliente.
Nota: Si no ejecuta el código del lado del servidor e intenta ejecutar el código del lado del cliente primero, se producirá un error de conexión rechazada.
Vea la siguiente imagen para comprenderlo:
Aquí, las partes negras de la imagen indican la dirección IP y el número de puerto del cliente conectado. Ahora ingrese el mensaje desde la terminal del servidor.
Ahora puede enviar datos del cliente al servidor. El modelo servidor-cliente se comunica mediante TCP/IP. Ingrese los datos del cliente del terminal y verifique.
Aquí no terminé la conexión. Entonces ambos pueden comunicarse hasta que se cierre la conexión. Presione Ctrl + C en qué terminal desea salir.