2009-08-12 4 views
5

Angenommen, ein Server hat eine Named Pipe "myTestPipe" erstellt. Wie viele Clients können sich mit "myTestPipe" verbinden? Von dem was ich im Web gelesen habe, scheint es nur einen Client zu geben, wollte aber dafür sorgen.Anzahl der Clients, die eine Verbindung zu einer Named Pipe herstellen können

Wenn nur eine, dann ist es am besten, die Blockierung WaitForConnection() anstelle der Asunchronous-Methode BeginWaitForConnection() zu verwenden, da der Server wartet, bis ein Client-Prozess verbindet und dann die Kommunikation ?! (Sie müssen sich keine Sorgen über andere Clients machen, um eine Verbindung herzustellen)

Antwort

9

Sie können mehrere Clients gleichzeitig mit derselben benannten Pipe verbinden. Unter Windows glaube ich, dass die aktuelle Beschränkung 256 gleichzeitige Verbindungen zu einer einzelnen Named Pipe ist, einschließlich der Verbindung des Servers.

(Leider kann ich die Spur der entsprechenden MSDN-Seite als Referenz nicht, aber diese CPAN pipes reference erwähnt diese Einschränkung.)

+1

Vielen Dank für Ihre Antwort. Ich habe jedoch eine Frage: Ich bin ein Server implementieren, der Binärdateien empfängt, die von NamedPipeClients über eine Named Pipe gesendet werden. Angenommen, ich habe einen NamedPipeClient mit mehreren Threads, in dem ich mehr als einen Thread instanziieren kann, um Dateien gleichzeitig zu senden. Wie wäre es möglich, dass der Server den Quellclient unterscheidet, der diese Bytes tatsächlich gesendet hat? Vielleicht sollte meine Frage sein: Wenn mehr als ein Client Daten in die Pipe schreibt, ist sie so mit anderen überlagert, dass man nicht sagen kann, wer was gesendet hat? hoffe, es ist gut erklärt! Nochmals vielen Dank – Derar

+1

Es gibt tatsächlich ein paar verschiedene Optionen hier, einschließlich überlappende I/O, Multithreading oder Completion-Routinen. MSDN verfügt über eine gute Dokumentation (einschließlich aller 3 Optionen) zum Behandeln mehrerer Clientverbindungen von einem einzelnen Server hier: http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx –

+0

Es ist wichtig Beachten Sie, dass eine einzelne Server-Pipe-Instanz nur einen einzigen Client verarbeiten kann. Ein bestimmtes _named pipe_ kann mehrere Verbindungen verarbeiten, aber auf diese Verbindungen muss immer noch gewartet und von einer separaten Server-Pipe-Instanz verarbeitet werden. Sobald eine Server-Pipe-Instanz eine Verbindung hergestellt hat, kann sie nicht für zusätzliche Verbindungen verwendet werden, bis die aktuelle Verbindung getrennt wurde und die Server-Pipe auf eine andere warten kann. Die obige Antwort stimmt mit den Fakten überein, macht sie jedoch aufgrund der Verwirrung zwischen einer Named Pipe und einem Server-Pipe-Objekt nicht klar. –

9

Sie ein Rohr tatsächlich schaffen und auf eine Verbindung warten, und wenn es eine Verbindung, erstellen zweite und warte darauf.

Für jede Pipe, die Sie erstellen und auf die Verbindung warten, erhalten Sie höchstens eine Verbindung (gleichzeitig - Sie können sie recyceln, wenn sie Request/Response/Close-Stil sind).

So ist jede Verbindung 1 zu 1, wie ein Socket oder anderen Strom.

+0

Wie gehen Sie damit um, wenn zu viele Clients eine zu schnelle Verbindung herstellen? Ich habe mich selbst zu Spammern gemacht, indem ich 20 Anfragen an meinen Server, der Ihren Ansatz verwendet, durchgeführt habe, aber nach 2-3 Client-Verbindungen würde der Rest der Anfrage versuchen, eine Verbindung mit der bestehenden Verbindung herzustellen, aber zu dem Zeitpunkt, an dem sie versuchen, eine Anfrage zu senden bereits geschlossen. Gibt es eine Möglichkeit, die Anzahl der Verbindungen pro 'NamedPipeServerStream' zu begrenzen? – codenamezero