none
Comportamiento inesperado al usar recvfrom - Sockets RRS feed

  • Pregunta

  • Buenas tardes

     

    Estoy desarrollando una aplicación en la que ejecuto el siguiente proceso: establezco una conexión TCP con un servidor, envío un mensaje a dicho servidor e inmediatamente después espero una respuesta del mismo. Necesito asegurarme que recibo una respuesta para cada petición realizada. Para hacer esto, creo un socket, luego ejecuto sendto para enviar el mensaje al servidor y luego, haciendo uso del mismo socket, ejecuto la función recvfrom para esperar los datos del servidor.

    Cuando ejecuto este proceso una sola vez no hay inconvenientes. El problema aparece cuando lo ejecuto varias veces en threads cada 140 ms. Haciendo debug, puedo ver que si ejecuto este proceso n veces se envían n peticiones al servidor y se ejecuta la instrucción recvfrom n veces para esperar los datos de respuesta, pero la aplicación sólo atiende una respuesta del servidor sin importar cuantas veces este responda. ¿Podrían decirme que estoy haciendo mal? Ante la necesidad de verificar que recibo una respuesta del servidor ante cada petición se me ocurrió crear threads, teniendo la intención de que cada hilo permanezca activo hasta recibir la respuesta. ¿Existe otra manera de hacerlo? Estoy abierto a cualquier sugerencia.

     

    De antemano muchas gracias por la colaboración.

     

     

    martes, 1 de febrero de 2011 22:18

Todas las respuestas

  • ¿Inicializas el sistema de Sockets cada vez que arrancas un thread?
    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 3 de febrero de 2011 16:36
    Moderador
  • Buenas tardes ... gracias por la respuesta

    Lo inicializo una vez al iniciar el programa, luego creo los sockets y los uso como describí en el primer mensaje. Probé también que cada vez que creara un socket inicializara de nuevo winsock y obtengo los mismos resultados. ¿Estoy cometiendo un error?

    Muchas gracias

    jueves, 3 de febrero de 2011 17:40
  • Tienes que inicializar los sockets en cada hilo, no en cada conexión. Y cada vez que un hilo muera debes cerrar la incialización. Es decir, cada hilo tiene que llamar a WSastartup() y a WSACleanup() antes de terminar.

    Por otro lado, tienes que asegurarte del tema de la sincronización: o bien cada thread usa sus propias variables locales de todo, datos recibidos, etc o bien usas variables "globales" (en el sentido de ser las mismas para todos los threads, y entonces tienes que sincronizarlas con una sección crítica o mutex para no pisar unas con otras...

     


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 3 de febrero de 2011 21:04
    Moderador
  • Buenas tardes

    Tardé en mi respuesta porque necesitaba realizar varias pruebas.

    Hice lo que me dijo pero continúo con el mismo comportamiento. Instancio las demás variables que intervienen en el proceso de manera local en cada método. Al parecer el servidor con el que me conecto sólo responde a la última petición.

    Haciendo un debug, cuando mantengo sólo una instancia del socket, y lo uso para todas las peticiones, hay varias respuestas del servidor pero se reciben desde la última hacia la primera (primero responde el thread que se ejecutó al final, luego el penúltimo, ...). De esta manera no puedo asegurar que la respuesta que recibo corresponde al proceso que la recibe. ¿Alguna otra sugerencia?

    Gracias por la atención

     

    viernes, 18 de febrero de 2011 22:05
  • Hola Kricher,

    Entiendo que lo que ocurre es normal, pues estás utilizando una conexión no mantenida recvfrom, sendto

    si quieres una respuesta por mismo canal, deberías utilizar una conexión mantenida send, recv.

     

    si esta opcion no es posible, a lo mejor podrías implementar una cabecera con el id de la transmision y que las respuesta

    te la devuelva, luego todos así si mantienes una lista, sabrás qué mensajes fuero respondidos,

     

    un saludo,

    Roni.


    Roni Gonzalez Kalil rgk-soft Simple, efectivo e industrial
    martes, 12 de abril de 2011 17:25