les autres réponses sur ce fil sont totalement légitimes mais je crois que je peux ajouter un peu à lui. Discutons ce qu'est un port d'achèvement, comme je le comprends.
Un port d'achèvement est un récepteur d'événements. C'est-à-dire qu'un événement se produit, un port d'achèvement est notifié.
Maintenant, il y a bien sûr une grande taxonomie d'événements. Le port d'achèvement est bien adapté aux événements d'un type particulier: les compléments d'E/S. Il y a un brevet de Cutler et de gang écrit dans un langage étonnamment lisible par l'homme, qui décrit comment IOCP s'intègre au noyau NT. Récapitulatif: un port d'achèvement est un récepteur d'événements bien adapté à la réception de notifications de complétions d'E/S.
Maintenant, nous allons revenir à la question de l'OP:
Comment puis-je configurer prises IOCP pour plusieurs auditeurs (sur des ports différents)?
Votre événement est une réalisation d'un appel AcceptEx() précédente. Il s'agit généralement d'un appel connect() côté client, mais il peut également s'agir d'une désactivation de votre carte réseau. Vous décidez d'abord si vous souhaitez que les connexions sur le même port soient traitées simultanément ou en série. Aussi, vous devez décider si vous voulez avoir des connexions sur différents ports à traiter simultanément ou en série.
Je vois trois approches possibles:
- toutes les complétions de connexion sont sérialisés
CreateIOCompletionPort dès le départ une fois, BindIOCompletionCallback à pour chaque auditeur, un thread de travail qui appelle GetQueuedCompletionStatus comme RbMm décrit
- les complétions de connexion du même écouteur (sur le même port) sont sérialisées, mais la connexion est terminée ions sur des ports différents sont en même temps
vous devez créer un port d'achèvement par auditeur et tourner un travailleur qui va GetQueuedCompletionStatus()
- toutes les complétions de connexion sont simultanées
Vous pouvez avoir un port d'achèvement, mais vous obtenez plusieurs threads pour appeler GetQueuedCompletionStatus()
Vous n'êtes pas nécessairement limité à avoir igs comme je l'ai décrit ci-dessus. Les ports d'achèvement sont intelligents, vous pouvez donc utiliser un port et plusieurs serveurs, et les serveurs acquièrent des verrous par écouteur pour la sérialisation. Les machines du port d'achèvement dans le noyau comprendront que vous avez bloqué et relâché d'autres serveurs si nécessaire.
Récapitulatif: tout d'abord, vous décidez de la manière dont vous voulez être concurrentiel. Ensuite, vous choisissez le nombre de ports d'achèvement dont vous avez besoin.
Je ne sais pas si cela peut aider, mais j'ai cet exemple enregistré: http://www.serverframework.com/asynchronousevents/2012/03/windows-8-registered-io---multi-threaded-rio -iocp-udp-example -server.html – lsalamon