Created
July 7, 2024 21:36
-
-
Save alonsoir/09e5357d0205854895743459ccc6f7c8 to your computer and use it in GitHub Desktop.
a tcp client and server sample in c.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#define BUFFER_SIZE 1024 | |
void error(const char *msg) { | |
perror(msg); | |
exit(1); | |
} | |
int main(int argc, char *argv[]) { | |
if (argc != 3) { | |
fprintf(stderr, "Uso: %s <direccion IP> <puerto>\n", argv[0]); | |
exit(1); | |
} | |
const char *server_ip = argv[1]; | |
int port = atoi(argv[2]); | |
int sock = 0; | |
struct sockaddr_in serv_addr; | |
char buffer[BUFFER_SIZE] = {0}; | |
// Crear socket | |
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { | |
error("Error al crear el socket"); | |
} | |
// Configurar dirección del servidor | |
memset(&serv_addr, 0, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_port = htons(port); | |
// Convertir dirección IP de texto a binario | |
if (inet_pton(AF_INET, server_ip, &serv_addr.sin_addr) <= 0) { | |
error("Dirección no válida / Dirección no soportada"); | |
} | |
// Conectar al servidor | |
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
error("Conexión fallida"); | |
} | |
printf("Conectado al servidor %s en el puerto %d\n", server_ip, port); | |
while (1) { | |
printf("Ingrese el mensaje (o 'salir' para terminar): "); | |
if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) { | |
printf("Error al leer la entrada\n"); | |
break; | |
} | |
// Remover el salto de línea | |
size_t len = strlen(buffer); | |
if (len > 0 && buffer[len-1] == '\n') { | |
buffer[len-1] = '\0'; | |
len--; | |
} | |
// Salir si el mensaje es 'salir' | |
if (strcmp(buffer, "salir") == 0) { | |
printf("Cerrando conexión...\n"); | |
break; | |
} | |
// Verificar si el mensaje no está vacío | |
if (len == 0) { | |
printf("Mensaje vacío, por favor ingrese un mensaje.\n"); | |
continue; | |
} | |
// Enviar mensaje al servidor | |
if (send(sock, buffer, len, 0) < 0) { | |
error("Error al enviar mensaje"); | |
} | |
// Limpiar el buffer para recibir la respuesta | |
memset(buffer, 0, BUFFER_SIZE); | |
// Leer respuesta del servidor | |
int valread = read(sock, buffer, BUFFER_SIZE); | |
if (valread < 0) { | |
error("Error en la lectura de datos"); | |
} else if (valread == 0) { | |
printf("El servidor cerró la conexión\n"); | |
break; | |
} | |
printf("Respuesta del servidor: %s\n", buffer); | |
// Limpiar el buffer para el siguiente mensaje | |
memset(buffer, 0, BUFFER_SIZE); | |
} | |
// Cerrar el socket | |
close(sock); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <signal.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#define BUFFER_SIZE 1024 | |
int server_fd = -1; // Declarar el socket del servidor a nivel global | |
int new_socket = -1; // Declarar el socket del cliente a nivel global | |
void error(const char *msg) { | |
perror(msg); | |
exit(1); | |
} | |
void handle_signal(int signal) { | |
printf("Recibida señal %d, cerrando el servidor...\n", signal); | |
if (new_socket >= 0) { | |
close(new_socket); | |
} | |
if (server_fd >= 0) { | |
close(server_fd); | |
} | |
exit(0); | |
} | |
int main(int argc, char *argv[]) { | |
if (argc != 2) { | |
fprintf(stderr, "Uso: %s <puerto>\n", argv[0]); | |
exit(1); | |
} | |
int port = atoi(argv[1]); | |
struct sockaddr_in address; | |
socklen_t addrlen = sizeof(address); | |
char buffer[BUFFER_SIZE] = {0}; | |
const char *hello = "Hello from server"; | |
// Configurar manejadores de señales | |
signal(SIGINT, handle_signal); | |
signal(SIGTERM, handle_signal); | |
// Crear socket | |
server_fd = socket(AF_INET, SOCK_STREAM, 0); | |
if (server_fd < 0) { | |
error("Error al abrir el socket"); | |
} | |
// Asignar dirección y puerto | |
memset(&address, 0, sizeof(address)); | |
address.sin_family = AF_INET; | |
address.sin_addr.s_addr = INADDR_ANY; | |
address.sin_port = htons(port); | |
// Enlazar | |
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { | |
error("Error en el binding"); | |
} | |
// Escuchar | |
if (listen(server_fd, 5) < 0) { | |
error("Error en la escucha"); | |
} | |
printf("Servidor escuchando en el puerto %d\n", port); | |
// Aceptar conexión | |
new_socket = accept(server_fd, (struct sockaddr *)&address, &addrlen); | |
if (new_socket < 0) { | |
error("Error al aceptar conexión"); | |
} | |
printf("Conexión aceptada\n"); | |
while (1) { | |
// Leer datos del cliente | |
int valread = read(new_socket, buffer, BUFFER_SIZE); | |
if (valread < 0) { | |
error("Error en la lectura de datos"); | |
} else if (valread == 0) { | |
printf("Cliente desconectado\n"); | |
break; | |
} | |
buffer[valread] = '\0'; // Asegurarse de que el buffer está null-terminated | |
printf("Datos recibidos: %s\n", buffer); | |
// Enviar respuesta al cliente | |
if (send(new_socket, hello, strlen(hello), 0) < 0) { | |
error("Error al enviar mensaje"); | |
} | |
printf("Mensaje enviado: %s\n", hello); | |
} | |
// Cerrar el socket del cliente | |
close(new_socket); | |
// Cerrar el socket del servidor | |
close(server_fd); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment