Problema cliente/servidor
Hola grupo,
tengo un problema que no sé como resolver. La cuestión es que he programado un servidor chat en C para Linux y un cliente chat hecho en Java para que se pueda acceder desde la Web. Hasta aqui todo funciona perfectamente.
El problema llega cuando, estando algun cliente conectado, yo detengo el servidor. Como es de esperar, los clientes se desconectan automaticamente, pero soy incapaz de volver a ejecutar el servidor mientras los navegadores de los clientes estén abiertos. El servidor me da un error al abrir el bind.
En cuanto se cierran los navegadores, el servidor puede volver a ejecutarse.
Alguna idea?
Gracias
David
tengo un problema que no sé como resolver. La cuestión es que he programado un servidor chat en C para Linux y un cliente chat hecho en Java para que se pueda acceder desde la Web. Hasta aqui todo funciona perfectamente.
El problema llega cuando, estando algun cliente conectado, yo detengo el servidor. Como es de esperar, los clientes se desconectan automaticamente, pero soy incapaz de volver a ejecutar el servidor mientras los navegadores de los clientes estén abiertos. El servidor me da un error al abrir el bind.
En cuanto se cierran los navegadores, el servidor puede volver a ejecutarse.
Alguna idea?
Gracias
David
No se si te servirá, pero puedes probar.
Mientras la conexión no quede correctamente cerrada por ambas partes, el servicio queda en un estado de pendiente de cerrarse. (puedes verlo con un netstat -a)
Hay una función en c de linux que se setsockopt() en la que se pueden poner opciones para los sockets. Una de ellas es SO_REUSEADDR, que permite reabrir un servicio aunque todavía este un poco pillado. Esta opción me ha eliminado el error de bind de "address already in use".
Esta opción no sé si te sirve porque los clientes que tengo, detectan la pérdida de conexión y se cierran automáticamente para volver a intentar reengancharse, con lo cual no es exactamente tu caso.
Otra opción es SO_KEEPALIVE que permite detectar más rápidamente cuando un socket se ha cerrado.
El la que uso para que los clientes detecten cuando se rompe la conexión para cerrarla automáticamente y tratar de volver a reengancharse pasados unos segundos.
Se bueno.
Mientras la conexión no quede correctamente cerrada por ambas partes, el servicio queda en un estado de pendiente de cerrarse. (puedes verlo con un netstat -a)
Hay una función en c de linux que se setsockopt() en la que se pueden poner opciones para los sockets. Una de ellas es SO_REUSEADDR, que permite reabrir un servicio aunque todavía este un poco pillado. Esta opción me ha eliminado el error de bind de "address already in use".
Esta opción no sé si te sirve porque los clientes que tengo, detectan la pérdida de conexión y se cierran automáticamente para volver a intentar reengancharse, con lo cual no es exactamente tu caso.
Otra opción es SO_KEEPALIVE que permite detectar más rápidamente cuando un socket se ha cerrado.
El la que uso para que los clientes detecten cuando se rompe la conexión para cerrarla automáticamente y tratar de volver a reengancharse pasados unos segundos.
Se bueno.
