#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <signal.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int server_fd;
int running = 1;
// Manejo de señal para detener el servidor
void handle_sigint(int sig) {
printf("\nServidor detenido.\n");
if (server_fd) {
close(server_fd);
}
exit(0);
}
void start_server() {
int new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
const char *message = "Hello from the C server!\n";
// Crear socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
// Configurar dirección
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Asociar socket con dirección
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
// Escuchar conexiones
if (listen(server_fd, 3) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
printf("Servidor en ejecución en el puerto %d\n", PORT);
printf("\n Nota: Presione (Ctrl + C) para deterner el Servidor \n");
// Aceptar conexiones
while (running && (new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) >= 0) {
read(new_socket, buffer, BUFFER_SIZE);
send(new_socket, message, strlen(message), 0);
close(new_socket);
}
}
int main() {
int choice;
// Configurar manejo de señal
signal(SIGINT, handle_sigint);
while (1) {
printf("\n--- Menú del servidor ---\n");
printf("1. Iniciar servidor\n");
printf("2. Detener servidor\n");
printf("Seleccione una opción: ");
scanf("%d", &choice);
if (choice == 1) {
printf("Iniciando servidor...\n");
start_server();
} else if (choice == 2) {
printf("Servidor detenido manualmente.\n");
running = 0;
if (server_fd) {
close(server_fd);
}
break;
} else {
printf("Opción no válida. Intente nuevamente.\n");
}
}
return 0;
}
Tags
Lenguaje C
