diff --git a/P6/daytime-tcp-client-L110.c b/P6/daytime-tcp-client-L110.c new file mode 100644 index 0000000000000000000000000000000000000000..0832147fa88866c2fa23b4af1f6265966ed31950 --- /dev/null +++ b/P6/daytime-tcp-client-L110.c @@ -0,0 +1,116 @@ +/** + * Practica Tema 6: DAYTIME TCP + * Redondo Calleja, Daniel + * Jimenez Prieto, Roberto + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <sys/socket.h> +#include <unistd.h> + +#define MAX_ARGS 4 +#define MAX_BUFFER 1024 +#define DAYTIME_MSG "¿Que dia es hoy?" + +int main(int argc, char *argv[]) { + int sockfd; + struct sockaddr_in server_addr, client_addr; + struct servent *service; + unsigned short port; + char buffer[MAX_BUFFER]; + + // Validar el número de argumentos + if (argc != MAX_ARGS - 2 && argc != MAX_ARGS) { + fprintf(stderr, "Error, numero incorrecto de argumentos\n"); + fprintf(stderr, "Uso: %s ip_servidor [-p puerto_servidor]\n", argv[0]); + exit(1); + } + + // Convertir la IP del servidor a formato de red y asignarla a server_addr + if (!inet_aton(argv[1], &server_addr.sin_addr)) { + fprintf(stderr, "Error al convertir la IP del servidor.\n"); + exit(1); + } + + // Comprobar si se especifica el puerto + if (argc == MAX_ARGS && strcmp(argv[2], "-p") == 0) { + // Si se proporciona el puerto, convertirlo a entero + port = (unsigned short) atoi(argv[3]); + if (port == 0) { + fprintf(stderr, "Error: puerto invalido.\n"); + exit(1); + } + } else { + // Obtener el puerto asociado al servicio DAYTIME usando getservbyname, si no se especifica el puerto + service = getservbyname("daytime", "tcp"); + if (!service) { + fprintf(stderr, "Error obteniendo el puerto para DAYTIME con getservbyname.\n"); + exit(1); + } + port = service->s_port; + } + + // Crear socket TCP + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) { + fprintf(stderr, "Error creando el socket.\n"); + exit(1); + } + + // Configurar la dirección del cliente (local) + client_addr.sin_family = AF_INET; + client_addr.sin_port = htons(0); + client_addr.sin_addr.s_addr = INADDR_ANY; + + // Asociar el socket a la IP y puerto locales + if (bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr)) < 0) { + fprintf(stderr, "Error en el bind.\n"); + close(sockfd); + exit(1); + } + + // Configurar la dirección del servidor + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + + // Establecer la conexión con el servidor + if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + fprintf(stderr, "Error al conectar con el servidor.\n"); + close(sockfd); + exit(1); + } + + // Enviar la cadena "¿Qué día es hoy?" al servidor + if (send(sockfd, DAYTIME_MSG, strlen(DAYTIME_MSG), 0) < 0) { + fprintf(stderr, "Error enviando el mensaje.\n"); + close(sockfd); + exit(1); + } + + printf("Mensaje enviado: \"%s\" a la direccion %s en el puerto %d\n", DAYTIME_MSG, argv[1], port); + printf("Esperando respuesta...\n"); + + // Esperar la respuesta del servidor + ssize_t len = recv(sockfd, buffer, MAX_BUFFER - 1, 0); + if (len < 0) { + printf("Error recibiendo el mensaje"); + close(sockfd); + exit(1); + } + + // Añadir terminador nulo al final de la respuesta + buffer[len] = '\0'; + + // Mostrar la respuesta por pantalla + printf("Respuesta del servidor: %s\n", buffer); + + // Cerrando conexion + shutdown(sockfd, SHUT_RDWR); + close(sockfd); + + return 0; +}