Benannte Rohrvorgänge
Wenn der Pipeserver zum ersten Mal die CreateNamedPipe--Funktion aufruft, verwendet er die nMaxInstances Parameter, um die maximale Anzahl von Instanzen der Pipe anzugeben, die gleichzeitig vorhanden sein können. Der Server kann CreateNamedPipe- wiederholt aufrufen, um zusätzliche Instanzen der Pipe zu erstellen, solange die maximale Anzahl von Instanzen nicht überschritten wird. Wenn die Funktion erfolgreich ist, gibt jeder Aufruf ein Handle an das Serverende einer benannten Pipeinstanz zurück.
Sobald der Pipeserver eine Pipeinstanz erstellt, kann ein Pipeclient eine Verbindung damit herstellen, indem er die CreateFile- oder CallNamedPipe--Funktion aufruft. Wenn eine Pipeinstanz verfügbar ist, gibt CreateFile ein Handle an das Clientende der Pipeinstanz zurück. Wenn keine Instanzen der Pipe verfügbar sind, kann ein Pipeclient die WaitNamedPipe-Funktion verwenden, um zu warten, bis eine Pipe verfügbar ist.
Ein Pipeserver kann bestimmen, wann ein Pipeclient mit einer Pipeinstanz verbunden ist, indem er die ConnectNamedPipe--Funktion aufruft. Wenn sich der Pipehandle im Blockierungs-Wartemodus befindet, wird ConnectNamedPipe- erst zurückgegeben, wenn ein Client verbunden ist.
Pipeclients und -server können neben CallNamedPipe- eine von mehreren Funktionen aufrufen, um aus einer benannten Pipe zu lesen und in eine benannte Pipe zu schreiben. Das Verhalten dieser Funktionen hängt von der Art der Rohre und den Modi ab, die für den angegebenen Rohrpunkt wirksam sind, wie folgt:
- Die funktionen ReadFile und WriteFile können entweder mit Bytetyp- oder Nachrichtentyp-Pipes verwendet werden.
- Die funktionen ReadFileEx und WriteFileEx können entweder mit Bytetyp- oder Nachrichtentyprohren verwendet werden, wenn der Rohrziehpunkt für überlappende Vorgänge geöffnet wurde.
- Die PeekNamedPipe--Funktion kann verwendet werden, um zu lesen, ohne den Inhalt eines Byte-Typ-Pipes oder einer Nachrichtentyppipeline zu entfernen. PeekNamedPipe- können auch zusätzliche Informationen zur Pipeinstanz zurückgeben.
- Die TransactNamedPipe--Funktion kann mit Duplexrohren vom Nachrichtentyp verwendet werden, wenn der Pipehandle für den Aufrufvorgang auf den Nachrichtenlesemodus festgelegt ist. Die Funktion schreibt eine Anforderungsnachricht und liest eine Antwortnachricht in einem einzigen Vorgang, wodurch die Netzwerkleistung verbessert wird.
Der Pipeserver sollte erst dann einen Blockierungslesevorgang ausführen, wenn der Pipeclient gestartet wurde. Andernfalls kann eine Rennbedingung auftreten. Dies tritt in der Regel auf, wenn Initialisierungscode, z. B. die der C-Laufzeitbibliothek, geerbte Handles sperren und untersuchen müssen.
Wenn ein Client und ein Server mit einer Pipeinstanz fertig sind, sollte der Server zuerst die FlushFileBuffers--Funktion aufrufen, um sicherzustellen, dass alle Bytes oder Nachrichten, die in die Pipe geschrieben wurden, vom Client gelesen werden. FlushFileBuffers erst zurückgegeben, wenn der Client alle Daten aus der Pipe gelesen hat. Der Server ruft dann die DisconnectNamedPipe-Funktion auf, um die Verbindung mit dem Pipeclient zu schließen. Diese Funktion macht das Handle des Clients ungültig, wenn er noch nicht geschlossen wurde. Alle ungelesenen Daten in der Pipe werden verworfen. Nachdem der Client getrennt wurde, ruft der Server die CloseHandle--Funktion auf, um sein Handle an die Pipeinstanz zu schließen. Alternativ kann der Server ConnectNamedPipe- verwenden, um eine Verbindung mit dieser Instanz der Pipe herzustellen.
Ein Prozess kann Informationen zu einer benannten Pipe abrufen, indem die GetNamedPipeInfo Funktion aufgerufen wird, die den Typ der Pipe, die Größe der Eingabe- und Ausgabepuffer und die maximale Anzahl von Pipeinstanzen zurückgibt, die erstellt werden können. Die GetNamedPipeHandleState Funktionsberichte zu den Lese- und Wartemodi eines Pipehandles, der aktuellen Anzahl von Pipeinstanzen und zusätzlichen Informationen für Rohre, die über ein Netzwerk kommunizieren. Die SetNamedPipeHandleState--Funktion legt den Lesemodus und die Wartemodi eines Rohrziehpunkts fest. Bei Pipeclients, die mit einem Remoteserver kommunizieren, steuert die Funktion auch die maximale Anzahl von Bytes, die erfasst werden sollen, oder die maximale Wartezeit, bevor eine Nachricht übertragen wird (vorausgesetzt, das Handle des Clients wurde nicht mit aktiviertem Schreibmodus geöffnet).