Modes d’ouverture de canal nommé
Le serveur de canal spécifie les modes d’accès au canal, de chevauchement et d’écriture directe dans le paramètre dwOpenMode de la fonction CreateNamedPipe . Les clients de canal peuvent spécifier ces modes ouverts pour leurs handles de canal à l’aide de la fonction CreateFile .
Mode d’accès
Définir le mode d’accès au canal revient à spécifier l’accès en lecture ou en écriture associé aux handles du serveur de canal. Le tableau suivant montre le droit d’accès générique équivalent pour chaque mode d’accès que vous pouvez spécifier avec CreateNamedPipe.
Mode d’accès | Droit d’accès générique équivalent |
---|---|
PIPE_ACCESS_INBOUND | GENERIC_READ |
PIPE_ACCESS_OUTBOUND | GENERIC_WRITE |
PIPE_ACCESS_DUPLEX | GENERIC_READ | GENERIC_WRITE |
Si le serveur de canal crée un canal avec PIPE_ACCESS_INBOUND, le canal est en lecture seule pour le serveur de canal et en écriture seule pour le client de canal. Si le serveur de canal crée un canal avec PIPE_ACCESS_OUTBOUND, le canal est en écriture seule pour le serveur de canal et en lecture seule pour le client de canal. Un canal créé avec PIPE_ACCESS_DUPLEX est en lecture/écriture pour le serveur de canal et le client de canal.
Les clients de canal utilisant CreateFile pour se connecter à un canal nommé doivent spécifier un droit d’accès dans le paramètre dwDesiredAccess compatible avec le mode d’accès spécifié par le serveur de canal. Par exemple, un client doit spécifier GENERIC_READ accès pour ouvrir un handle pour un canal créé par le serveur de canal avec PIPE_ACCESS_OUTBOUND. Les modes d’accès doivent être les mêmes pour toutes les instances d’un canal.
Pour lire des attributs de canal comme le mode lecture ou le mode de blocage, le handle de canal doit avoir le droit d’accès FILE_READ_ATTRIBUTES ; pour écrire des attributs de canal, le handle de canal doit avoir le droit d’accès FILE_WRITE_ATTRIBUTES. Ces droits d’accès peuvent être combinés avec le droit d’accès générique approprié pour le canal : GENERIC_READ avec FILE_WRITE_ATTRIBUTES pour un canal en lecture seule ou GENERIC_WRITE avec FILE_READ_ATTRIBUTES pour un canal d’écriture seule. La restriction des droits d’accès de cette façon offre une meilleure sécurité pour le canal.
Mode superposé
En mode chevauchant, les fonctions effectuant de longues opérations de lecture, d’écriture et de connexion peuvent être retournées immédiatement. Cela permet au thread d’effectuer d’autres opérations pendant qu’une opération chronophage s’exécute en arrière-plan. Pour spécifier le mode superposé, utilisez l’indicateur FILE_FLAG_OVERLAPPED. Pour plus d’informations, consultez Entrée et sortie synchrones et superposées.
La fonction CreateFile permet au client de canal de définir le mode superposé (FILE_FLAG_OVERLAPPED) pour ses handles de canal à l’aide du paramètre dwFlagsAndAttributes .
mode Write-Through
Spécifiez le mode d’écriture directe avec FILE_FLAG_WRITE_THROUGH. Ce mode affecte uniquement les opérations d’écriture dans les canaux de type octet entre les clients de canal et les serveurs de canal sur différents ordinateurs. En mode écriture directe, les fonctions qui écrivent dans un canal nommé ne retournent pas les données tant que les données ne sont pas transmises sur le réseau et dans la mémoire tampon du canal sur l’ordinateur distant. Le mode d’écriture directe est utile pour les applications qui nécessitent une synchronisation pour chaque opération d’écriture.
Si le mode d’écriture directe n’est pas activé, le système améliore l’efficacité des opérations réseau en mettant en mémoire tampon les données jusqu’à ce qu’un nombre minimal d’octets se soit accumulé ou jusqu’à ce qu’une période maximale soit écoulée. La mise en mémoire tampon permet au système de combiner plusieurs opérations d’écriture en une seule transmission réseau. Cela signifie qu’une opération d’écriture peut être effectuée avec succès une fois que le système a mis les données dans la mémoire tampon sortante, mais avant que le système ne les transmette sur le réseau.
La fonction CreateFile permet au client de canal de définir le mode d’écriture directe (FILE_FLAG_WRITE_THROUGH) pour ses handles de canal à l’aide du paramètre dwFlagsAndAttributes . Le mode d’écriture directe d’un handle de canal ne peut pas être modifié une fois le handle de canal créé. Le mode d’écriture directe peut être différent pour les handles serveur et client pour le même canal instance.
Un client de canal peut utiliser la fonction SetNamedPipeHandleState pour contrôler le nombre d’octets et le délai d’attente avant la transmission d’un canal sur lequel le mode d’écriture directe est désactivé. Pour un canal en lecture seule, le handle de canal doit être ouvert avec les droits d’accès GENERIC_READ et FILE_WRITE_ATTRIBUTES.