Skip to content
Snippets Groups Projects
Commit 06ad9f08 authored by danredo's avatar danredo
Browse files

Upload New File

parent f527fb85
Branches
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