elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sockets no orientados a conexion usando select
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sockets no orientados a conexion usando select  (Leído 3,327 veces)
rootLink

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Sockets no orientados a conexion usando select
« en: 5 Septiembre 2022, 14:36 pm »

Buenas tengo problema entendiendo este tema de select, con ayuda de unos compañeros logramos armar un servidor usado select siguiendo la documentación dentro del man de linux
Pero lamentablemente nos salió bien por azares de la vida, no lo termine de entender bien y ahora nos piden que reciba varios clientes(ya lo hace) pero que cuando un cliente envié un mensaje el servidor lo transmita a todos y no tengo ni idea de como comenzar el cliente

Este es el codigo

Código:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/select.h>

#define TAM 1024

int main(int argc, char *argv[]) {
int i, s, s_conec, leido, ndesc;
unsigned int tam_dir;
struct sockaddr_in dir, dir_cliente;
char buf[TAM];
int opcion=1;
fd_set desc_sockets;
fd_set desc_sockets_copia;

if (argc!=2) {
                fprintf(stderr, "Uso: %s puerto\n", argv[0]);
                return 1;
        }
if ((s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("error creando socket");
return 1;
}
/* Para reutilizar puerto inmediatamente */
        if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opcion, sizeof(opcion))<0){
                perror("error en setsockopt");
                return 1;
        }
dir.sin_addr.s_addr=INADDR_ANY;
dir.sin_port=htons(atoi(argv[1]));
dir.sin_family=PF_INET;
if (bind(s, (struct sockaddr *)&dir, sizeof(dir)) < 0) {
perror("error en bind");
close(s);
return 1;
}

if (listen(s, 5) < 0) {
perror("error en listen");
close(s);
return 1;
}

FD_ZERO(&desc_sockets);
FD_SET(s, &desc_sockets);
while (1) {
desc_sockets_copia=desc_sockets;
if ((ndesc=select(FD_SETSIZE, &desc_sockets_copia,
NULL, NULL, NULL))<0) {
perror("error en select");
close(s);
return 1;
}
if (FD_ISSET(s, &desc_sockets_copia)) {
ndesc--;

tam_dir=sizeof(dir_cliente);
if ((s_conec=accept(s, (struct sockaddr *)&dir_cliente,
&tam_dir))<0){
perror("error en accept");
close(s);
return 1;
}
FD_SET(s_conec, &desc_sockets);
}
for (i=0; ndesc; i++) {
if (FD_ISSET(i, &desc_sockets_copia)) {
ndesc--;
if ((leido=read(i, buf, TAM))>0) {
if (write(i, buf, leido)<0) {
perror("error en write");
close(s);
return 1;
}
}

if (leido<0) {
perror("error en read");
close(s);
return 1;
}
if (leido==0) { // cliente cierra conexión
close(i);
FD_CLR(i, &desc_sockets);
}
}
}
}

close(s);

return 0;
}


Lo tengo probado bajo la consola de linux, los sockets son un tema muy complicado para mi y alguien pudiera instruirme o darme luz se lo agradecería de verdad muy fuerte, gracias por leerme y espero puedan ayudarme a salir de este relajo


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines