2010-09-08 13 views
0

Je peux trouver des tonnes d'articles sur le démarrage d'un serveur IOCP, mais aucun sur l'arrêt correctement =/Comment arrêter correctement un serveur IOCP?

Quelle est la bonne façon d'éteindre le serveur lorsque vous avez terminé? plus précisément, j'utilise déjà PostQueuedCompletionStatus() pour indiquer aux threads de travail de quitter, mais je n'ai pas besoin d'annuler toutes les E/S en attente et de fermer toutes les sockets avant de quitter?

J'ai trouvé CancelSynchronousIo() sur MSDN, et il semble que je pourrais avoir chaque thread de travail appeler cette fonction quand il reçoit la notification d'achèvement de quitter ... est-ce la bonne façon de le faire?

merci pour toute aide à ce sujet.

Répondre

2

Si vous effectuez une boucle sur toutes les connexions ouvertes et que vous arrêtez toutes les sockets, toutes les E/S en attente se termineront d'elles-mêmes et le serveur s'arrêtera. Vous pouvez soit fermer avec une fermeture persistante pour permettre à toutes les données d'écriture en attente de se terminer, soit désactiver les données d'écriture en attente et réinitialiser les connexions avec un RST plutôt que d'arrêter proprement.

J'ai quelques exemples de serveurs IOCP here, que vous avez peut-être déjà vu, mais qui montrent comment vous pouvez obtenir un arrêt propre.

+0

Merci =) Un joli code aussi. Beaucoup plus propre et compréhensible que la plupart des projets que j'ai vus. – bitwise

+0

L'idée originale était de faciliter la réutilisation du code dans divers projets que j'avais à l'époque. Tout l'exemple de code que j'avais vu était très difficile à réutiliser et incluait souvent ce que je considérais comme des conceptions «douteuses» ... Maintenant, 10 ans plus tard, j'utilise toujours du code basé sur ce code original et construisant toujours des clients et serveurs rapidement :) Donc tout s'est bien passé. –

Questions connexes