2015-02-24 1 views
0

Lorsque j'appelle WSASend() ou WSARecv() ou AcceptEx(), un paquet d'achèvement sera placé dans le port d'achèvement et je peux le supprimer en utilisant GetQueuedCompletionStatus(). Mais comment puis-je savoir quelle opération représente ce paquet d'achèvement?Comment savoir si un paquet d'achèvement est pour WSASend() ou WSARecv() ou AcceptEx()?

+2

Comparez le pointeur 'LPOVERLAPPED' que vous avez obtenu' GetQueuedCompletionStatus' avec le pointeur que vous avez passé à 'WSASend' et al. Vous pouvez également ajouter des membres supplémentaires à la fin de la structure pour stocker des informations supplémentaires. –

+0

Donc je peux ajouter un membre 'char' à la fin de la structure qui va contenir quel type d'opération c'était, par exemple: 'S', 'R', 'A'? (cela semble une meilleure alternative que de comparer des pointeurs!) –

+0

@ user4592590: oui, exactement. Raymond Chen a décrit cette fonctionnalité sur son blog: [Le CHEVAUCHEMENT associé aux E/S asynchrones est transmis par adresse, et vous pouvez en profiter] (http://blogs.msdn.com/b/oldnewthing/archive/2010/ 12/17/10106259.aspx) –

Répondre

2

Vous utilisez une structure OVERLAPPED 'étendue' qui contient d'autres informations. Souvent, cela contient également le tampon de données et certains indicateurs qui indiquent à l'appelant GetQueuedCompletionStatus() quel est le type d'achèvement.

Il y a beaucoup de tutoriels utiles sur IOCP sur le web et je pense que tous les expliquent car c'est assez fondamental. Mes tutoriels peuvent être trouvés here, avec du code qui implémente quelques serveurs IOCP simples.