Modos de tipo de canalización con nombre, lectura y espera

El servidor de canalización especifica el modo de tipo de canalización, el modo de lectura y el modo de espera en el parámetro dwPipeMode de la función CreateNamedPipe . Los clientes de canalización pueden especificar estos modos de canalización para sus identificadores de canalización mediante la función CreateFile .

Modo de tipo

El modo de tipo de una canalización determina cómo se escriben los datos en una canalización con nombre. Los datos se pueden transmitir a través de una canalización con nombre como una secuencia de bytes o como una secuencia de mensajes. El servidor de canalización especifica el tipo de canalización al llamar a CreateNamedPipe para crear una instancia de una canalización con nombre. Los modos de tipo deben ser los mismos para todas las instancias de una canalización.

Para crear una canalización de tipo byte, especifique PIPE_TYPE_BYTE o use el valor predeterminado. Los datos se escriben en la canalización como un flujo de bytes y el sistema no diferencia entre los bytes escritos en diferentes operaciones de escritura.

Para crear una canalización de tipo de mensaje, especifique PIPE_TYPE_MESSAGE. El sistema trata los bytes escritos en cada operación de escritura en la canalización como una unidad de mensaje. El sistema siempre realiza operaciones de escritura en canalizaciones de tipo mensaje como si se habilitara el modo de escritura a través.

Modo de lectura

El modo de lectura de una canalización determina cómo se leen los datos de una canalización con nombre. El servidor de canalización especifica el modo de lectura inicial de un identificador de canalización al llamar a CreateNamedPipe. Los datos se pueden leer en modo de lectura de bytes o en modo de lectura de mensajes. Un identificador de una canalización de tipo byte solo puede estar en modo de lectura de bytes. Un identificador de una canalización de tipo de mensaje puede estar en modo byte-read o message-read. Para una canalización de tipo de mensaje, el modo de lectura puede ser diferente para los identificadores de servidor y cliente en la misma instancia de canalización.

Para crear el identificador de canalización en modo de lectura de bytes, especifique PIPE_READMODE_BYTE o use el valor predeterminado. Los datos se leen desde la canalización como un flujo de bytes. Una operación de lectura se completa correctamente cuando se leen todos los bytes disponibles en la canalización o cuando se lee el número especificado de bytes.

Para crear el identificador de canalización en modo de lectura de mensajes, especifique PIPE_READMODE_MESSAGE. Los datos se leen desde la canalización como un flujo de mensajes. Una operación de lectura solo se completa correctamente cuando se lee todo el mensaje. Si el número especificado de bytes que se va a leer es menor que el tamaño del siguiente mensaje, la función lee la mayor cantidad posible del mensaje antes de devolver cero (la función GetLastError devuelve ERROR_MORE_DATA). El resto del mensaje se puede leer mediante otra operación de lectura.

En el caso de un cliente de canalización, un identificador de canalización devuelto por CreateFile siempre está en modo de lectura de bytes inicialmente. Tanto los clientes de canalización como los servidores de canalización pueden usar la función SetNamedPipeHandleState para cambiar el modo de lectura de un identificador de canalización. El controlador de canalización debe tener el derecho de acceso FILE_WRITE_ATTRIBUTES.

Modo de espera

El modo de espera de un identificador de canalización determina cómo las funciones ReadFile, WriteFile y ConnectNamedPipe controlan las operaciones largas. En el modo de espera de bloqueo, las funciones esperan indefinidamente para que un proceso en el otro extremo de la canalización complete una operación. En el modo de espera sin bloqueo, las funciones devuelven inmediatamente en situaciones que, de lo contrario, requerirían una espera indefinida.

Una operación ReadFile se ve afectada por el modo de espera de un identificador de canalización cuando la canalización está vacía. Con un identificador de espera de bloqueo, la operación no se completa correctamente hasta que los datos estén disponibles desde un subproceso escribiendo en el otro extremo de la canalización. Con un identificador de espera sin bloqueo, la función devuelve cero inmediatamente y la función GetLastError devuelve ERROR_NO_DATA.

Una operación WriteFile se ve afectada por el modo de espera de un identificador de canalización cuando no hay suficiente espacio en el búfer de la canalización. Con un identificador de espera de bloqueo, la operación de escritura no puede realizarse correctamente hasta que se cree suficiente espacio en el búfer mediante una lectura de subproceso desde el otro extremo de la canalización. Con un identificador de espera sin bloqueo, la operación de escritura devuelve un valor distinto de cero inmediatamente, sin escribir ningún bytes (para una canalización de tipo mensaje) o después de escribir tantos bytes como las suspensiones del búfer (para una canalización de tipo byte).

Una operación ConnectNamedPipe se ve afectada por el modo de espera de un identificador de canalización cuando no hay ningún cliente conectado o esperando conectarse a la instancia de canalización. Con un identificador de espera de bloqueo, la operación de conexión no se realiza correctamente hasta que un cliente de canalización se conecta a la instancia de canalización llamando a la función CreateFile o CallNamedPipe . Con un identificador de espera sin bloqueo, la operación de conexión devuelve cero inmediatamente y la función GetLastError devuelve ERROR_PIPE_LISTENING.

De forma predeterminada, todos los identificadores de canalización con nombre devueltos por la función CreateNamedPipe o CreateFile se crean con el modo de espera de bloqueo habilitado. Para crear la canalización en modo de espera sin bloqueo, el servidor de canalización especifica PIPE_NOWAIT al llamar a CreateNamedPipe.

Los clientes de canalización y los servidores de canalización pueden cambiar el modo de espera de un controlador de canalización especificando PIPE_WAIT o PIPE_NOWAIT en una llamada a la función SetNamedPipeHandleState .

Nota

El modo de espera sin bloqueo es compatible con Microsoft LAN Manager versión 2.0. Este modo no se debe usar para lograr entradas y salidas superpuestas (E/S) con canalizaciones con nombre. En su lugar, se debe usar E/S superpuesta, ya que permite que las operaciones con mucho tiempo se ejecuten en segundo plano después de que la función devuelva. Para obtener más información sobre la E/S superpuesta, vea Entrada y salida sincrónicas y superpuestas.