Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bidirektionale Names Pipes (wie bei Sockets)? (https://www.delphipraxis.net/170825-bidirektionale-names-pipes-wie-bei-sockets.html)

Zacherl 4. Okt 2012 15:39

Bidirektionale Names Pipes (wie bei Sockets)?
 
Hallo zusammen,

ich hatte mich vor einiger Zeit schonmal mit Names Pipes beschäftigt und im Grunde nur folgende Demos nach Delphi portiert:
Das funktioniert auch super, allerdings benötige ich etwas anderes. In den gezeigten Beispielen verbindet sich der Client zum Server und sendet ein Request. Der Server schickt dann ein Reply zurück und die Pipe wird danach geschlossen.

Nun möchte ich allerdings eine Funktionalität ähnlich der normalen Windows Sockets simulieren. Sprich: Der Client soll dauerhaft mit dem Server verbunden werden. Der Server muss bei bestimmten Ereignissen eine Art Broadcast Nachricht an alle verbundenen Clients schicken. Hierbei wäre es mir wichtig, dass der Client mit irgendeiner blocking Funktion auf neue eingehende Daten in der Pipe warten kann, damit er nicht permanent pullen muss.

:?: Meine Frage: Ist sowas mit den Named Pipes überhaupt möglich? Und wenn ja: Hat jemand ein gutes Beispiel?

Viele Grüße
Zacherl

Bummi 4. Okt 2012 16:02

AW: Bidirektionale Names Pipes (wie bei Sockets)?
 
ich habe dies hier
Code:
unit Pipes;

// This is a wonderful set of components for inter-process communication
// using Named Pipes. One of the best solutions when you need to communicate
// with an NT/2000/XP service, and/or communicate across an MS Windows network.
//
// Free Source Code, no license, no guarantee, no liability.
//
// The original author, Russell, gave this to me with no usage restrictions
// whatsoever.
//
// This package prepared by Tobias Giesen, tobias@tgtools.de
//
// March 2004
//
// Security added by Thomas Wassermann 20110228
// Filename may point to a File whose accessright will be used for Clientconnections
//

in angefummlter Form
Securityattributes InitializeSecurity(FSA); FKillEv:=CreateEvent(@FSA,...

im Einsatz, das Original gab es meine ich irgendwo bei Emba zum runterladen.

Verbindung offen lassen und jeder Zeit in beide Richtungen lesen/schreiben..

Zacherl 4. Okt 2012 16:17

AW: Bidirektionale Names Pipes (wie bei Sockets)?
 
Hallo Thomas,

das sieht schonmal sehr interessant aus :) Wenn das ohne Probleme zwischen Services / elevated / non elevated Prozessen funktioniert, ist das genau das, was ich suche.

Viele Grüße
Zacherl

Bummi 4. Okt 2012 16:26

AW: Bidirektionale Names Pipes (wie bei Sockets)?
 
Ich habe es im Netz im Einsatz mit 3 Schichten
1. direkt an der Maschine als Dienst
2. Middle-tier für die Protokllierung / Aufbereitung / Steerung als Dienst
3. GUI für die Adrstellung

zwischen 1 und 2 hängt eine Zugriffsberechtigung auf Dateiebene hängt ...

Delphi-Quellcode:
procedure TPipeServer.GenACLFromFile;
//20110228 by Thomas Wassermann
var
  res : Boolean;
  len : Cardinal;
  fDaclPresent,fDaclDefaulted:Bool;
begin
  FACL := nil;
  if Assigned(FpFileSD) then DoHeapFree(FpFileSD);
  if FileExists(FACLFileName) then
    begin
    res := GetFileSecurity(PChar(FACLFileName),DACL_SECURITY_INFORMATION,FpFileSD,0,len);
    if res or (GetLastError() = ERROR_INSUFFICIENT_BUFFER) then
       begin
         FpFileSD := DoHeapAlloc(len);
         GetFileSecurity(PChar(FACLFileName),DACL_SECURITY_INFORMATION,FpFileSD,len,len);
         GetSecurityDescriptorDacl(FpFileSD,fDaclPresent,FACL,fDaclDefaulted);
       end;
    end;
end;

Zacherl 4. Okt 2012 21:09

AW: Bidirektionale Names Pipes (wie bei Sockets)?
 
Hallo Thomas,

ich bin in dem Gebiet ACLs und so weiter nicht sonderlich fit, deshalb kann ich den Sinn bzw. Anwendungszeck deines Codeschnipsels leider grade nicht ganz nachvollziehen. So wie ich das sehe benutzt du eine Datei, um die SDs zu extrahieren und dann für die Pipe zu übenehmen, oder?

Mit dem Null Descriptor bin ich normalerweise immer ganz gut gefahren. Für Named Events zwischen Service und Desktop App habe ich das immer ohne Probleme verwendet. Bei den Event Namen konnte (musste) man allerdings noch das Prefix "Global\" dem eigentlichen Namen vorwegstellen, damit es auch wirlich funktioniert hat. Sowas scheint bei den Pipes leider nicht möglich zu sein.

Zwischen elevated und nicht elevated Anwendung funktionieren die Pipe Komponenten wunderbar, aber bisher habe ich es noch nicht hinbekommen, dass meine Desktop Anwendung (egal ob elevated oder nicht) mit dem Service kommunizieren kann.

Hast du da eventuell noch einen Tipp für mich?

Edit: Verdammt, das kommt davon, wenn man versucht mit Kopfschmerzen zu arbeiten. Hatte vergessen den Server in meinem Test Service auf Active zu setzen :wall: Jetzt funktioniert auch alles wie gewünscht. Danke nochmal :)

Viele Grüße
Zacherl

Bummi 4. Okt 2012 22:36

AW: Bidirektionale Names Pipes (wie bei Sockets)?
 
Local bzw. Gloabl im Zusammenhang mit Named Pipes kenne ich nicht.
Die Idee hinter der File-ACL ist es dem Kunden die Möglichkeit zu geben die Zugriffe auf die Server auf einfache Weise sperren/freigeben zu können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz