none
Problema con la función accept de windows sockets RRS feed

  • Pregunta

  • Hola a todos,

    Estoy desarrollando un servidor TCP para Windows XP bajo visual C++.

    El programa funciona perfectamente, puede aceptar varias conexiones de forma simultánea y tanto el procesado de paquetes entrantes como el envío de respuestas se llevan a cabo sin problemas.

    Sin embargo, cuando el programa está sin recibir conexiones entrantes durante aproximadamente unos 3 días, se puede ver en el Administrador de Tareas que la CPU está al 100%, y que deja de responder a las conexiones entrantes.

    Dados que guardo un fichero de log, donde se almacena si una conexión ha sido aceptada o ha habido algún error en dicha conexión, (la acción de imprimir en fichero la llevo a cabo justo después de llamar a la función "accept", junto con un "fflush" para que vacíe el buffer de escritura automáticamente en el fichero), he podido concluir que el programa se queda bloqueado en la llamada a la función "accept".

    La función "accept" para aceptar conexiones entrantes se lleva a cabo sobre un socket bloqueante,

    ¿alguien podría decirme si le ha pasado algo parecido y cual sería la solución para solucionar el problema?

    Muchas gracias por la ayuda

     

    viernes, 10 de septiembre de 2010 15:54

Todas las respuestas

  • Pues la verdad es que no sé si es algo normal que a los tres días una conexión de sockets entrante se bloquee o no, pero creo que la solución es sencilla: cuando lleves un tiempo sin recibir, desconecta, destruye y vuelve a crea el socket. Mucha coincidencia sería que justo en ese momento alguien intentara entrar, pero si lo hace supongo que tendrá una política de reintentos, como por ejemplo reintentar 3 veces cada x tiempo o con tiempos incrementales...

    Si es un problema de windows (que creo que no, si no no se entiende cómo van a estar semanas y meses algunos servidores conectados -o lo mismo es que desconectan y vuelven a conectar como te digo), lo verás resuelto. Si no es un problema de windows, quizás sea algo tuyo.

    Mira que no se te desborde ningún contador, y vigila las fugas de memoria, que también podría ser ese el problema.

    Para las fugas de memoria podrías mirarte esto: http://geeks.ms/blogs/rfog/archive/2010/07/01/detectando-fugas-de-memoria-en-visual-c.aspx 


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 16 de septiembre de 2010 14:30
    Moderador