Operaciones de canalización con nombre

La primera vez que el servidor de canalización llama a la función CreateNamedPipe , usa el parámetro nMaxInstances para especificar el número máximo de instancias de la canalización que pueden existir simultáneamente. El servidor puede llamar a CreateNamedPipe repetidamente para crear instancias adicionales de la canalización, siempre y cuando no supere el número máximo de instancias. Si la función se realiza correctamente, cada llamada devuelve un identificador al final del servidor de una instancia de canalización con nombre.

En cuanto el servidor de canalización crea una instancia de canalización, un cliente de canalización puede conectarse a él llamando a la función CreateFile o CallNamedPipe . Si hay disponible una instancia de canalización, CreateFile devuelve un identificador al final del cliente de la instancia de canalización. Si no hay ninguna instancia de la canalización disponible, un cliente de canalización puede usar la función WaitNamedPipe para esperar hasta que una canalización esté disponible.

Un servidor de canalización puede determinar cuándo un cliente de canalización está conectado a una instancia de canalización mediante una llamada a la función ConnectNamedPipe . Si el identificador de canalización está en modo de espera de bloqueo, ConnectNamedPipe no devuelve hasta que se conecta un cliente.

Los clientes y servidores de canalización pueden llamar a una de varias funciones (además de CallNamedPipe ) para leer y escribir en una canalización con nombre. El comportamiento de estas funciones depende del tipo de canalización y de los modos en vigor para el identificador de canalización especificado, como se indica a continuación:

  • Las funciones ReadFile y WriteFile se pueden usar con canalizaciones de tipo byte o de tipo de mensaje.
  • Las funciones ReadFileEx y WriteFileEx se pueden usar con canalizaciones de tipo byte o de tipo de mensaje si el identificador de canalización se abrió para las operaciones superpuestas.
  • La función PeekNamedPipe se puede usar para leer sin quitar el contenido de una canalización de tipo byte o de una canalización de tipo mensaje. PeekNamedPipe también puede devolver información adicional sobre la instancia de canalización.
  • La función TransactNamedPipe se puede usar con canalizaciones dúplex de tipo mensaje si el identificador de canalización para el proceso de llamada está establecido en modo de lectura de mensajes. La función escribe un mensaje de solicitud y lee un mensaje de respuesta en una sola operación, lo que mejora el rendimiento de la red.

El servidor de canalización no debe realizar una operación de lectura de bloqueo hasta que se haya iniciado el cliente de canalización. De lo contrario, se puede producir una condición de carrera. Esto suele ocurrir cuando el código de inicialización, como el de la biblioteca en tiempo de ejecución de C, debe bloquear y examinar los identificadores heredados.

Cuando un cliente y un servidor terminen de usar una instancia de canalización, el servidor primero debe llamar a la función FlushFileBuffers , para asegurarse de que el cliente lee todos los bytes o mensajes escritos en la canalización. FlushFileBuffers no devuelve hasta que el cliente haya leído todos los datos de la canalización. A continuación, el servidor llama a la función DisconnectNamedPipe para cerrar la conexión con el cliente de canalización. Esta función hace que el identificador del cliente no sea válido, si aún no se ha cerrado. Los datos no leídos de la canalización se descartan. Una vez desconectado el cliente, el servidor llama a la función CloseHandle para cerrar su identificador a la instancia de canalización. Como alternativa, el servidor puede usar ConnectNamedPipe para permitir que un nuevo cliente se conecte a esta instancia de la canalización.

Un proceso puede recuperar información sobre una canalización con nombre llamando a la función GetNamedPipeInfo , que devuelve el tipo de la canalización, el tamaño de los búferes de entrada y salida, y el número máximo de instancias de canalización que se pueden crear. La función GetNamedPipeHandleState informa sobre los modos de lectura y espera de un identificador de canalización, el número actual de instancias de canalización e información adicional para las canalizaciones que se comunican a través de una red. La función SetNamedPipeHandleState establece el modo de lectura y los modos de espera de un identificador de canalización. Para los clientes de canalización que se comunican con un servidor remoto, la función también controla el número máximo de bytes para recopilar o el tiempo máximo de espera antes de transmitir un mensaje (suponiendo que el identificador del cliente no se abrió con el modo de escritura a través habilitado).