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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con sockets C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con sockets C  (Leído 2,684 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con sockets C
« en: 17 Julio 2013, 02:55 am »

Hola a todos.

Estoy aprendiendo a usar sockets en C. (UNIX)

Ya he conseguido hacer un servidor concurrente sin fijarme en ningún ejemplo pero me ha surgido un problema:

Para hacerlo concurrente uso fork(), tengo configurado el server para que lea datos del cliente hasta que éste le envíe un '-1'. Cuando los recive los saca por pantalla y los reenvia. Hasta aquí todo bien, pero el problema es que si finalizo el cliente en lugar de con un '-1' con "ctrl+c", el server entra en bucle infinito, no para de escribir el último mensaje que recibió del cliente.

Por ello he buscado formas de comprobar el estado de un socket, he encontrado la función select(), pero por lo que entiendo ésta comprueba el estado de los descriptores desde el 0 hasta el que le indiquemos menos uno. Yo necesito algún método que permita comprobar el estado de un solo descriptor.
¿Cómo puedo hacerlo?

Muchas gracias.

PD. No subo el código porque es bastante largo, si hace falta decidme y lo subo, o decidme como poner un spoiler que no sé xDD.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con sockets C
« Respuesta #1 en: 17 Julio 2013, 08:03 am »

deberías detectar cuando un cliente se va... por ejemplo con un timeout... y en ese caso eliminar al cliente de la lista.

La mecánica para saber si un cliente sigue conectado o no varía en función de si usas TCP o UDP...

Por ejemplo te recomendaría es que los puertos los abrieses en el servidor como no bloqueantes y verificases antes de leer si el cliente ha enviado datos nuevos o no... en caso de no enviar datos nuevos y si salta el timeout borras la conexión.

Pero esto es así por encima... sin conocer el código es complicado dar más detalles.


En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Duda con sockets C
« Respuesta #2 en: 17 Julio 2013, 14:54 pm »

La función select() te permite comprobar cualquier descriptor y/o conjunto de descriptores. Vuelve a mirar la documentación de la función.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Duda con sockets C
« Respuesta #3 en: 17 Julio 2013, 18:20 pm »

Gracias por las respuestas, lo intentaré con select().

No entiendo como verificarlo con un timeout, subo el código del server: (TCP)

Código:
int main(int argc, char **argv)
{
const int PORT=1234;
const int BACKLOG=256;
const int INET_ADDRLEN=256;
const int BUFFER_SIZE=256;

int fd,fd2,rec_size,pr;
unsigned int sin_size=sizeof(sockaddr_in);
char buffer[BUFFER_SIZE];
sockaddr_in server,client;
char ip_handled[INET_ADDRLEN];

if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){
exit(-1);
}

server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=INADDR_ANY;
for(int i=0;i<8;i++) server.sin_zero[i]=0;

if((bind(fd,(sockaddr *)&server,sizeof(sockaddr_in)))==-1){
exit(-1);
}

if((listen(fd,BACKLOG))==-1){
exit(-1);
}
while(1){
printf("Listening...\n");
if((fd2=accept(fd,(sockaddr *)&client,&sin_size))==-1){
printf("Error en accept()\n");
close(fd);
exit(-1);
}else{
pr=fork();
switch(pr){
case -1:
cout<<"Critical Error"<<endl;
close(fd);
close(fd2);
exit(-1);
break;
case 0:
printf("Client lstened \n");
if(inet_ntop(AF_INET,&(client.sin_addr),ip_handled,INET_ADDRLEN)==NULL){
printf("Error en inet_ntop()\n");
close(fd);
close(fd2);
exit(-1);
}else{
printf("Handling client %s at port %d\n",ip_handled,ntohs(client.sin_port));
}
if((rec_size=recv(fd2,buffer,BUFFER_SIZE,0))==-1){
printf("Error en lectura\n");
close(fd);
close(fd2);
exit(-1);
}
while(strcmp(buffer,"-1")!=0){
printf("Mensaje recivido: \n\t%s\n",buffer);
if(send(fd2,buffer,rec_size,0)==-1){
printf("Error en escritura\n");
}
if((rec_size=recv(fd2,buffer,BUFFER_SIZE,0))==-1){
printf("Error en lectura\n");
close(fd);
close(fd2);
exit(-1);
}
}
exit(0);
break;
default:
break;
}
}
}
exit(0);
}
« Última modificación: 17 Julio 2013, 18:22 pm por SARGE553413 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda - Sockets
Programación Visual Basic
xtermsh 2 2,318 Último mensaje 3 Enero 2010, 18:05 pm
por xtermsh
[Duda] Sockets Sincronizados
Java
Amerikano|Cls 0 2,310 Último mensaje 23 Enero 2010, 22:19 pm
por Amerikano|Cls
duda con gethostbyname sockets
Programación C/C++
dkmarley 3 4,373 Último mensaje 6 Septiembre 2010, 01:51 am
por dkmarley
[Duda] Sockets VB.NET
.NET (C#, VB.NET, ASP)
kub0x 4 6,294 Último mensaje 18 Diciembre 2011, 15:12 pm
por kub0x
Chat c++ sockets windows duda
Programación C/C++
patilanz 8 3,821 Último mensaje 6 Mayo 2014, 08:45 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines