2016-06-11 15 views
0

Win7 x64, C++, Win32-API, Konsole app, Visual Studio Gemeinschaft 2015Win32 Named Pipe Verhalten

ich abgekocht habe alle SO Fragen über Named Pipes und kann die Antwort nicht gefunden ich brauche.

Ich schreibe einen Server zum Senden von Daten in einer Richtung über Named Pipe zu mehreren identischen Clients auf dem gleichen Computer. Der Server und jeder Client befindet sich in einem eigenen Prozess (.exe). Die Daten werden gesendet, wenn alle die Clients haben irgendwie zurück zum Server signalisiert, dass sie bereit sind (über benanntes Ereignis oder anderen Mechanismus).

Die documentation besagt, dass mehrere Clients eine Verbindung zu einer einzelnen Pipe-Instanz herstellen können, aber dann weiter über multiple instances sprechen.

Ich habe einige Fragen über das Rohr auf der Server-Seite:

  1. Für eine kleine Anzahl von Clients und geringen Durchsatz, das ist die einfachste: 1 Faden, 1 Pipe-Instanz; 1 Thread- und mehrere Pipe-Instanzen; mehrere Threads und eine Instanz pro Thread?
  2. Wenn ein einzelner Thread mehrere Male auf derselben Instanz einer Pipe ConnectNamedPipe ausführt, bedeutet dies, dass eine einzige WriteFile an alle Clients gesendet wird, die mit dieser bestimmten Instanz der Pipe verbunden sind?
  3. Wenn mehrere Clients eine Verbindung zu einer bestimmten Instanz einer Pipe herstellen können, schreibt sie vom serverseitigen Block in diese Pipe, bis alle die Clients die vorherige Nachricht gelesen haben?
  4. Ist eine Eins-zu-viele-Situation ungewöhnlich? Warum?
+3

* Die Dokumentation besagt, dass mehrere Clients eine Verbindung zu einer einzelnen Pipe-Instanz herstellen können * - Nein, Sie haben sie falsch gelesen und/oder falsch verstanden. Jede Instanz kann jeweils nur einen einzelnen Client unterstützen. (Und um Ihre Frage zu beantworten, ist bei einer kleinen Anzahl von Clients und geringem Durchsatz die Verwendung eines Threads pro Client am einfachsten.) –

Antwort

1

Die Dokumentation sagt mehrere Clients auf eine einzelne Pipe-Instanz

keine Verbindung herstellen können, es funktioniert nicht. Du hast falsch gelesen, was es eigentlich gesagt hat.

aber dann weiter über mehrere Instanzen zu sprechen.

Jede Pipe-Instanz kann immer nur mit einem Client kommunizieren. Wenn der Client beendet ist, kann der Server die Instanz entweder trennen und für einen neuen Client wiederverwenden, oder sie kann die Instanz zerstören und eine neue Instanz erstellen. In jedem Fall muss der Server für jeden Client, der eine Verbindung herstellt, eine separate Pipeinstanz erstellen.

1.Für eine kleine Anzahl von Clients und niedrigen Durchsatz, die die einfachste ist: 1 Thread, 1-Pipe-Instanz; 1 Thread- und mehrere Pipe-Instanzen; mehrere Threads und eine Instanz pro Thread?

Der erste Weg erlaubt nur 1 Client gleichzeitig.

Der zweite Weg ermöglicht dem Server, mehrere Instanzen für die Behandlung von simultanen Verbindungen zu erstellen, erfordert jedoch überlappende I/O, damit 1 Thread die mehreren Verbindungen verwalten kann.Der dritte Weg ermöglicht es dem Server auch, mehrere Instanzen für die Behandlung simultaner Verbindungen zu erstellen, aber er ist am einfachsten, da der Server jede Instanz in seinem eigenen Thread ausführen kann, wobei er den jeweils aktuellen Client bedient. Überlappende E/A wird nicht benötigt.

2.Wenn ein einzelner Thread ConnectNamedPipe mehrere Male auf derselben Instanz einer Pipe ausführt, bedeutet dies, dass eine einzelne WriteFile an alle Clients gesendet wird, die mit dieser bestimmten Instanz der Pipe verbunden sind?

3.Wenn mehrere Clients eine Verbindung zu einer bestimmten Instanz einer Pipe herstellen können, schreibt sie vom serverseitigen Block in diese Pipe, bis alle Clients die vorherige Nachricht gelesen haben?

Nein und nein, weil mehrere Clients nicht gleichzeitig mit einer Instanz verbunden werden können.

4. Ist eine Eins-zu-viele-Situation ungewöhnlich?

Eins-zu-viele ist mit Named Pipes nicht möglich. Aber Sie können mehrere gleichzeitige Eins-zu-eins-Verbindungen haben, und es ist nicht ungewöhnlich, Daten zwischen mehreren Verbindungen zu übertragen. In diesem Fall verwenden Sie am besten einen separaten Thread für jede Verbindung oder überlappende E/A. Auf diese Weise werden andere Clients nicht blockiert, wenn ein Client blockiert.

Verwandte Themen