Wie erkennt man eine Client-Verbindung mit einem Named Pipe-Client / Server?

8

Ich lerne über Named Pipes und spiele mit den Beispielen für named pipe client und server aus dem MSDN doc:

Named Pipe Server

Named Pipe Client

Ich habe den Client so modifiziert, dass ich Nachrichten in die Konsole eingeben und sie an den Server senden kann, wo er die Nachricht anzeigt und eine Antwort zurücksendet. Im Wesentlichen habe ich eine Schleife hinzugefügt, die nach dem Aufruf von SetNamedPipeHandleState () beginnt und vor dem Aufruf von CloseHandle () endet (d. H. Das Öffnen und Schließen geschieht außerhalb der Schleife, also verwende ich dasselbe Pipe-Handle innerhalb der Schleife).

Meine Frage ist, wenn ich den Client kill (durch Schließen oder Beenden über den Task-Manager) gibt es irgendeine Möglichkeit für die Server-Seite, die Trennung zu erkennen?

Ich habe versucht, GetNamedPipeHandleState () zu verwenden, in der Hoffnung, dass es einen Fehler zurückgibt, und ein Aufruf von GetLastError () würde ERROR_PIPE_NOT_CONNECTED zurückgeben, aber das war nicht der Fall. Wegen der Art, wie dieser Server eingerichtet ist, musste ich dies in der CompletedReadRoutine-Funktion tun und einen "kontrollierten" Fehler erzeugen. Was ich getan habe, war mit einem Breakpoint auf der CompletedReadRoutine im Server:

  1. hat den Server gestartet
  2. hat den Client gestartet
  3. hat eine Nachricht über den Client geschickt (trifft den Breakpoint im Server hier)
  4. hat den Client getötet
  5. Hat den GetNamedPipeHandleState
  6. durchlaufen

Der Aufruf von GetNamedPipeHandleState () gibt erfolgreich zurück, so dass ich den Aufruf GetLastError () nie ausführen konnte. Wenn es zu dem WriteFileEx-Aufruf kommt, schlägt es fehl, und ein Aufruf von GetLastError an diesem Punkt gibt ein ERROR_NO_DATA zurück.

Wenn ich mir die Rohrfunktionen anschaue, kann ich nichts anderes mehr sehen, das hier helfen könnte. Mir fehlt etwas oder ist ein Client nicht mehr zu trennen.

Die einzige andere Sache, die ich mir vorstellen kann, ist das Sammeln der PIDs der verbindenden Clients (über GetNamedPipeClientProcessId) und das Aussperren von Watchdog-Threads, um zu überprüfen, ob sie noch am Leben sind. Wenn ich nur darüber nachdenke, macht das meinen gespaltenen Sinn.

Gibt es eine Möglichkeit, getrennte Clients zu erkennen, wenn Sie Named Pipes verwenden?

    
Robert Groves 03.03.2010, 21:58
quelle

2 Antworten

5

Gibt ReadFile() return und error und GetLastError() dann ERROR_BROKEN_PIPE zurück?

    
Len Holgate 04.03.2010, 06:07
quelle
1

ReadFile() + GetLastError() machen den Job gut. Hier ist, wie sie mit I / O Completion Ports verwendet werden können (meine Implementierung ist in Python + Ctypes, aber die Idee sollte klar sein):

%Vor%

Wir warten auf ein Completion-Paket, und wenn ein Client eine Verbindung herstellt, wechseln wir zur Hauptschleife. In der Hauptschleife lesen wir die Pipe und prüfen, ob der Client die Verbindung unterbrochen hat, indem wir ReadFile() return code und GetLastError() betrachten. Dann werden wir wieder auf ein Completion-Paket warten.

Ein Client kann die Verbindung in jeder Phase trennen. Das Abschlusspaket wird in die Warteschlange gestellt und wir erhalten ERROR_BROKEN_PIPE .

    
wombatonfire 05.06.2016 20:09
quelle

Tags und Links