Avant de me lancer dans quelques expériences réseau, je me pose quelques questions. Il me semble avoir vu que la fonction de base pour lire des données sur une socket, sous Windows, était "recv" ; or cette fonction est par défaut bloquante, d'où le besoin de passer par des threads. Jusque là, rien de bien compliqué.
En revanche, quand arrive la fin de l'application, il faut terminer tous ces threads, et sauf erreur de ma part il n'est pas possible de les terminer proprement (signal ou autre) puisque si le thread est en attente de données et que rien n'arrive il restera bloqué indéfiniment. Utiliser "TerminateThread" n'est pour autant pas une solution, puisque ça ne libère pas les éventuelles ressources qu'aurait pu utiliser le thread. On peut envisager de préallouer toutes les ressources et de faire en sorte que le thread n'alloue absolument rien, mais c'est quand même une sacré contrainte (et ça n'enlève pas le fait que TerminateThread soit un peu violent).
D'un autre côté, on pourrait aussi rendre les sockets non bloquantes, de façon à pouvoir signaler à tout moment à un thread qu'il doit s'arrêter et lui permettre de le faire proprement. Mais cela implique une boucle qui appelle régulièrement un "recv" non bloquant, et je suppose que pour ne pas pomper tout le CPU il faudrait coller un Sleep() quelque part. Du coup, on introduit un léger lag au niveau de la réception des données (avec un Sleep(200), il faut potentiellement 200ms pour que le programme se rende compte qu'il a reçu des données), à moins qu'il existe une solution de lecture "bloquante mais pas trop longtemps" qui permette au programme de se mettre en attente de données pour un certain temps et d'abandonner si rien n'est reçu.
Bref, quelle est pour vous la bonne méthode, puisque j'imagine qu'il en existe au moins une qui n'a pas tous les désavantages que je viens de citer ?
Merci
