Skip to content
Snippets Groups Projects
Commit 4c7972cd authored by danredo's avatar danredo
Browse files

Upload New File

parent b93e664d
No related branches found
No related tags found
No related merge requests found
/**
* 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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment