Skip to content

Instantly share code, notes, and snippets.

@alonsoir
Created July 7, 2024 21:36
Show Gist options
  • Save alonsoir/09e5357d0205854895743459ccc6f7c8 to your computer and use it in GitHub Desktop.
Save alonsoir/09e5357d0205854895743459ccc6f7c8 to your computer and use it in GitHub Desktop.
a tcp client and server sample in c.
#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;
}
#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