2010-03-16 7 views
0

Je viens juste de commencer à apprendre la programmation réseau en C fonctionne, et je l'ai écrit un petit programme qui envoie des messages à partir d'un terminal et UNIX. J'utilise pthreads dans mon programme, dont l'un attend essentiellement recvfrom() pour recevoir un message.Annuler recvfrom UDP en C sous Unix

Cependant, je veux être en mesure de fermer toutes les discussions correctement si les utilisateurs choisit de quitter le programme. La façon dont je l'ai configuré en ce moment, un thread différent annule le thread en attente sur recvfrom, mais je suis inquiet que ce ne soit pas une bonne idée puisque je laisse les sockets non fermées et je ne libère pas toute la mémoire attribué.

Existe-t-il un moyen d'annuler un appel recvfrom() ou un moyen d'exécuter une certaine routine lors de l'annulation d'un pthread?

Merci.

Répondre

1

Si vous utilisez pthread_kill pour envoyer un signal au fil, recvfrom() doit retourner -1 avec errno ensemble à EINTR - vous pouvez vérifier la condition « l'application est sortie maintenant » et terminer avec élégance.

1

Une autre approche serait de maintenir une liste de connexion ouverte en correspondance avec identifiant de fil de. Ensuite, chaque fois que vous annulez un thread, parcourez la liste pour trouver son socket et appelez-le à proximité du socket.