Named Pipe-Instanzen
Der einfachste Pipeserver erstellt eine einzelne instance einer Pipe, stellt eine Verbindung mit einem einzelnen Client her, kommuniziert mit dem Client, trennt den Client, schließt das Pipehandle und beendet. Es ist jedoch üblicher, dass ein Pipeserver mit mehreren Pipeclients kommuniziert. Ein Pipeserver könnte eine einzelne Pipe instance verwenden, um eine Verbindung mit mehreren Pipeclients herzustellen, indem er nacheinander eine Verbindung mit jedem Client herstellt und die Verbindung mit diesen trennt, aber die Leistung wäre schlecht. Der Pipeserver muss mehrere Pipeinstanzen erstellen, um mehrere Clients gleichzeitig effizient verarbeiten zu können.
Es gibt drei grundlegende Strategien für die Wartung mehrerer Pipeinstanzen.
- Erstellen Sie einen separaten Thread für jede instance der Pipe. Ein Beispiel für einen Multithreadpipeserver finden Sie unter Multithreaded Pipe Server.
- Verwenden Sie überlappende Vorgänge, indem Sie eine OVERLAPPED-Struktur in den Funktionen ReadFile, WriteFile und ConnectNamedPipe angeben. Ein Beispiel finden Sie unter Named Pipe-Server mit überlappenden E/A-Vorgängen.
- Verwenden Sie überlappende Vorgänge mithilfe der Funktionen ReadFileEx und WriteFileEx , die eine Vervollständigungsroutine angeben, die nach Abschluss des Vorgangs ausgeführt werden soll. Ein Beispiel finden Sie unter Named Pipe Server Using Completion Routines.
Der Multithread-Pipeserver ist am einfachsten zu schreiben, da der Thread für jeden instance die Kommunikation für einen einzelnen Pipeclient verarbeitet. Das System weist jedem Thread nach Bedarf Prozessorzeit zu. Jeder Thread verwendet jedoch Systemressourcen. Dies ist ein Nachteil für einen Pipeserver, der eine große Anzahl von Clients verarbeitet.
Mit einem Singlethread-Server ist es einfacher, Vorgänge zu koordinieren, die sich auf mehrere Clients auswirken, und es ist einfacher, freigegebene Ressourcen vor dem gleichzeitigen Zugriff durch mehrere Clients zu schützen. Die Herausforderung eines Singlethreadservers besteht darin, dass er die Koordination von überlappenden Vorgängen erfordert, um Prozessorzeit für die Behandlung der gleichzeitigen Anforderungen von Clients zuzuweisen.