Comment puis-je me réveille select() sur une socket?

Je suis actuellement en utilisant sélectionnez boucle pour gérer les supports d'une procuration. L'une des exigences de la présente procuration est que si le proxy envoie un message à l'extérieur de serveur et ne pas obtenir une réponse dans un certain temps, le proxy doit fermer le socket et essayez de vous connecter à un serveur secondaire. La fermeture se fait dans un thread séparé, tandis que l'sélectionnez thread se bloque en attente pour l'activité.

J'ai de la difficulté à trouver comment détecter que cette prise fermé spécifiquement, de sorte que je peux gérer l'échec. Si je l'appelle close() dans l'autre thread, je reçois un EBADF, mais je ne peux pas dire qui socket fermée. J'ai essayé de détecter le support par le biais de l'exception fdset, pensant qu'il allait contenir le socket fermée, mais je ne suis pas d'obtenir quoi que ce soit restitués. J'ai aussi entendu l'appel de l'arrêt() envoie une FIN pour le serveur et de recevoir un AILERON arrière, de sorte que je peux la fermer; mais le point est moi qui essayais de fermer ce résultat n'obtenez pas de réponse dans le délai, donc je ne peux pas faire, que ce soit.

Si mes suppositions sont fausses, faites le moi savoir. Toutes les idées seront les bienvenues.

EDIT:
En réponse aux suggestions sur l'utilisation de sélectionner le temps: j'ai besoin de faire la clôture de manière asynchrone, parce que le client qui se connecte au proxy du temps et je ne peux pas attendre autour pour le sélectionner pour être interrogés. Cela ne fonctionne que si j'ai le temps très petit, ce qui pourrait ensuite être constamment interrogation et le gaspillage des ressources que je ne veux pas.

OriginalL'auteur Doldrim | 2009-08-25