

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Este documento contiene el código fuente de dos ejemplos: un servidor y un cliente que utilizan sockets de flujo en c. El servidor escucha conexiones en un puerto específico y acepta nuevas conexiones, mientras que el cliente se conecta a un servidor especificado y envía y recibes datos. El documento también incluye instrucciones sobre cómo compilar y ejecutar los ejemplos.
Tipo: Apuntes
1 / 3
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!


** server.c -- Ejemplo de servidor de sockets de flujo */
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/wait.h> #include <signal.h>
#define MYPORT 3490 // Puerto al que conectarán los usuarios
#define BACKLOG 10 // Cuántas conexiones pendientes se mantienen en cola
void sigchld_handler(int s) { while(wait(NULL) > 0); }
int main(void) { int sockfd, new_fd; // Escuchar sobre sock_fd, nuevas conexiones sobre new_fd struct sockaddr_in my_addr; // información sobre mi dirección struct sockaddr_in their_addr; // información sobre la dirección del cliente int sin_size; struct sigaction sa; int yes=1;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); }
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof (int)) == -1) { perror("setsockopt"); exit(1); }
my_addr.sin_family = AF_INET; // Ordenación de bytes de la máquina my_addr.sin_port = htons(MYPORT); // short, Ordenación de bytes de la red my_addr.sin_addr.s_addr = INADDR_ANY; // Rellenar con mi dirección IP memset(&(my_addr.sin_zero), '\0', 8); // Poner a cero el resto de la estructura
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
perror("bind"); exit(1); }
if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); }
sa.sa_handler = sigchld_handler; // Eliminar procesos muertos sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) == -1) { perror("sigaction"); exit(1); }
while(1) { // main accept() loop sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { perror("accept"); continue; } printf("server: got connection from %s\n", inet_ntoa (their_addr.sin_addr)); if (!fork()) { // Este es el proceso hijo close(sockfd); // El hijo no necesita este descriptor if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); // El proceso padre no lo necesita }
return 0;
** client.c -- Ejemplo de cliente de sockets de flujo */
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h>