Named Pipe-Vorgänge
Wenn der Pipeserver zum ersten Mal die CreateNamedPipe-Funktion aufruft , verwendet er den 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 Named Pipe-instance zurück.
Sobald der Pipeserver eine Pipe instance erstellt, kann ein Pipeclient eine Verbindung mit dem Pipeserver herstellen, indem er die CreateFile- oder CallNamedPipe-Funktion aufruft. Wenn eine Pipe instance verfügbar ist, gibt CreateFile ein Handle an das Clientende der Pipe instance 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 wird.
Ein Pipeserver kann durch Aufrufen der ConnectNamedPipe-Funktion bestimmen, wann ein Pipeclient mit einer Pipe verbunden ist instance. Wenn sich das 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 Named Pipe zu lesen und in diese zu schreiben. Das Verhalten dieser Funktionen hängt wie folgt vom Typ der Pipe und den Modi ab, die für das angegebene Pipehandle wirksam sind:
- Die Funktionen ReadFile und WriteFile können entweder mit Byte- oder Nachrichtentyppipes verwendet werden.
- Die Funktionen ReadFileEx und WriteFileEx können entweder mit Byte- oder Nachrichtentyppipes verwendet werden, wenn das Pipehandle für überlappende Vorgänge geöffnet wurde.
- Die PeekNamedPipe-Funktion kann zum Lesen verwendet werden, ohne den Inhalt einer Pipe vom Typ Byte oder einer Nachrichtentyppipe zu entfernen. PeekNamedPipe kann auch zusätzliche Informationen zum Pipe-instance zurückgeben.
- Die TransactNamedPipe-Funktion kann mit Duplexpipes vom Nachrichtentyp verwendet werden, wenn das Pipehandle für den aufrufenden Prozess auf den Nachrichtenlesemodus festgelegt ist. Die Funktion schreibt eine Anforderungsnachricht und liest eine Antwortnachricht in einem einzelnen Vorgang, wodurch die Netzwerkleistung verbessert wird.
Der Pipeserver sollte erst dann einen blockierenden Lesevorgang ausführen, wenn der Pipeclient gestartet wurde. Andernfalls kann eine Racebedingung auftreten. Dies tritt in der Regel auf, wenn Initialisierungscode, z. B. der der C-Laufzeitbibliothek, geerbte Handles sperren und untersuchen muss.
Wenn ein Client und server die Verwendung einer Pipe instance abgeschlossen haben, sollte der Server zuerst die FlushFileBuffers-Funktion aufrufen, um sicherzustellen, dass alle in die Pipe geschriebenen Bytes oder Nachrichten vom Client gelesen werden. FlushFileBuffers wird 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 es noch nicht geschlossen wurde. Alle ungelesenen Daten in der Pipe werden verworfen. Nachdem die Verbindung zwischen dem Client getrennt wurde, ruft der Server die CloseHandle-Funktion auf, um sein Handle für die Pipe instance zu schließen. Alternativ kann der Server ConnectNamedPipe verwenden, um einem neuen Client die Verbindung mit dieser instance der Pipe zu ermöglichen.
Ein Prozess kann Informationen zu einer Named Pipe abrufen, indem er die GetNamedPipeInfo-Funktion aufruft , 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-Funktion meldet die Lese- und Wartemodi eines Pipehandles, die aktuelle Anzahl von Pipeinstanzen und zusätzliche Informationen zu Pipes, die über ein Netzwerk kommunizieren. Die SetNamedPipeHandleState-Funktion legt den Lesemodus und den Wartemodus eines Pipehandles fest. Bei Pipeclients, die mit einem Remoteserver kommunizieren, steuert die Funktion auch die maximale Anzahl der zu sammelnden Bytes oder die maximale Wartezeit vor der Übertragung einer Nachricht (vorausgesetzt, das Handle des Clients wurde nicht mit aktiviertem Schreibzugriffsmodus geöffnet).