C/Visual C - socket - perdida de conexion

 
Vista:

socket - perdida de conexion

Publicado por oscar (20 intervenciones) el 29/09/2006 23:44:48
hola
tengo un server en C++ ( utilizo #include <sys/socket.h>) el cual recibe mensajes continuamente a periodos fijos los cuales se leen con messageLen = recv( clientDF, messageBuffer, BUFFER_SIZE, 0 ).
Luego de 30 mins aprox, el socket pierde la conexion y la excepcion no puede atraparse con un catch ( Exception & ex ), a que podria deberse? un buffer que se saturo?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:socket - perdida de conexion

Publicado por Tom (8 intervenciones) el 02/10/2006 18:43:33
Pues sin saber más es difícil encontrar la causa entre las 1000 posibles :-)
¿Tu server sólo admite una conexión (sólo abres un socket)?

Si tienes disponible fcntl() trata de ponerle el flag F_SETOWN al socket (clientDF) y quizás así consigas capturar la excepción.

Y, si has abierto un SOCK_STREAM (creo que sí), si hay un error de transmisión no corregido para algún paquete, la conexión se acabará cerrando tras un timeout, que supongo dependerá de la implementación de los sockets.

Por cierto, ¿has comparado messageLen con BUFFER_SIZE?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:socket - perdida de conexion

Publicado por oscar (20 intervenciones) el 04/10/2006 18:21:40
Pues si, la conexion se realiza con estas funciones:
serverDF = socket( AF_INET, SOCK_STREAM, 0 );
bind( serverDF, ( struct sockaddr * ) & server, sizeof( struct sockaddr_in ) )
listen( serverDF, MAX_CLIENTS )
quiza el probelma no este en el socket mismo, sino la forma en que se recive los mensajes de los clientes:

void * start_client( void ) {
if ( ( clientDF = accept( serverDF, ( struct sockaddr * ) & client, & sin_size ) ) == -1 )
....
messageLen = recv( clientDF, messageBuffer, BUFFER_SIZE, 0 )
....
pthread_exit( NULL );
}

ya que esta funcion esta dentro de una hebra:

rClient = pthread_create( & clientThread, NULL, start_client, NULL );

revisare lo que dices, lo malo es que el programa (el proceso en si) muere sin ningun rastro, como si le hibiesen hecho un kill, ahora tengo una duda: si la hebra quedara aun en ejecucion aun cuando el proceso padre muere, supongo que si, pero no lo veo con un ps.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:socket - perdida de conexion

Publicado por oscar (20 intervenciones) el 04/10/2006 21:16:37
- No, el server puede admitir n conexiones, para cada uno de ellos se crea una hebra.
- si se habre con SOCK_STREAM y las excepciones se atrapan con catch ( Exception & e ).
- no comparo messageLen con BUFFER_SIZE, acaso no ocurre siempre que messageLen <= BUFFER_SIZE ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:socket - perdida de conexion

Publicado por oscar (20 intervenciones) el 04/10/2006 23:11:50
Al parecer este fenomeno ocurre cuando el servidor esta en espera:
messageLen = recv( myclient, myBuffer, BUFFER_SIZE, 0 )
por mucho tienpo, y luego accede un nuevo cliente, lo cual genera que en la consola aparezca el mensaje: "> Aborted" cuando se ejecuta:
send( myclient, myresponse.c_str(), myresponse.size(), 0 );
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar