Je travaille actuellement sur un mécanisme IPC basé sur des canaux nommés utilisant un port d'achèvement d'E/S.Quand les paquets de port d'E/S sont-ils envoyés et quand?
Malheureusement, j'ai quelques problèmes avec la documentation msdn car je ne comprends pas très bien dans quels cas les appels à ReadFile/WriteFile aboutissent à un paquet d'achèvement.
Le cas où FALSE est retourné avec ERROR_IO_PENDING est clair, mais qu'en est-il du cas apparemment possible, lorsque ERROR_MORE_DATA est renvoyé? Y aura-t-il un paquet d'achèvement dans ce cas? De plus, que faire si d'autres erreurs sont renvoyées? Dans quels cas dois-je gérer le résultat et libérer des ressources directement et pas dans le gestionnaire de complétion?
Un autre cas serait de savoir si ReadFile/WriteFile réussit même, ce qui est apparemment aussi possible. MSDN est heureusement assez clair sur ce here:
De plus, la fonction WriteFile peuvent parfois renvoyer TRUE avec une valeur GetLastError de ERROR_SUCCESS, même si elle utilise une poignée asynchrone (qui peut également retourner FAUX avec ERROR_IO_PENDING). ... Dans cet exemple, la recommandation consisterait à autoriser la routine de port d'achèvement à être seule responsable de toutes les opérations de libération de ces ressources.
Est-ce cette recommandation correcte dans tous les cas, et le résultat d'une opération ReadFile/WriteFile pour les poignées affectées à un port d'achèvement pourrait (et devrait) être complètement ignoré en fait, parce qu'un paquet est envoyé au port de toute façon ?