Windows Service - IPC
-
Hi,
ich möchte einen Windows-Service schreiben, welcher OpenVPN Verbindungen aufbaut.
Gleichzeitig soll ein GUI-Programm abfragen können, ob eine Verbinung besteht, oder nicht.Wie gehe ich da am Besten vor?
In Beispielen habe ich folgende ICP-Variante gefunden:
namespace ServiceApp { public class MyWinService : System.ServiceProcess.ServiceBase { public MyWinService() { this.CanPauseAndContinue = false; this.ServiceName = "MyWinService"; } System.Runtime.Remoting.Channels.Ipc.IpcServerChannel ipcServer = null; protected override void OnStart(string[] args) { base.OnStart(args); if (ipcServer == null) { //ipcServer = new System.Runtime.Remoting.Channels.Ipc.IpcServerChannel("MyServicePort"); System.Collections.IDictionary properties = new System.Collections.Hashtable(); properties["name"] = "ipc"; properties["authorizedGroup"] = "Everyone"; properties["portName"] = "MyServicePort"; ipcServer = new System.Runtime.Remoting.Channels.Ipc.IpcServerChannel(properties, null); System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(ipcServer, false); System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType(typeof(ControlClass), "MyServiceControl", System.Runtime.Remoting.WellKnownObjectMode.Singleton); Console.WriteLine(ipcServer.GetChannelUri()); } } protected override void OnStop() { base.OnStop(); if (ipcServer != null) System.Runtime.Remoting.Channels.ChannelServices.UnregisterChannel(ipcServer); ipcServer = null; } protected override void OnShutdown() { base.OnShutdown(); } protected override void OnPause() { base.OnPause(); } protected override void OnContinue() { base.OnContinue(); } } [Serializable()] public class ControlClass : MarshalByRefObject, Interfaces.IMyControler { public int DoFunction(string command) { System.IO.File.WriteAllText("c:\\temp\\servicecommand.txt", command); return 1; } } }
Mein Problem: Woher weis die Klasse "ControlClass" dann, ob eine Verbindung besteht?
Gruß
-
Dein Verbindungsaufbau des IPC_Channels auf Serverseite und Clientseite
in ein Try-Catch und wenn du ein Catch fängst hast du keine Verbindung und
loggst dir das in einer Variable mit die du dann abfragst.
-
Ohne mir jetzt genau den Code durchlesen zu wollen....IPC würde ich fast immer mit Sockets machen. Das ist in C# längst nicht mehr so "schwer" und aufwendig wie es mit der WinAPI mal war und ist zudem noch rasend schnell.
-
Also ich würde IPC für ein C# Windows Service eher über DCOM machen - einfach nur weil ich das schonmal gemacht habe und daher weiss wie es geht (und schon einiges an Helper-/Boilerplatecode rumliegen habe). Aber viele Wege führen nach Rom. Vielleicht ist .NET Remoting sogar einfacher.
Raven280438 schrieb:
Mein Problem: Woher weis die Klasse "ControlClass" dann, ob eine Verbindung besteht?
"Verbindung" ist in dem Zusammenhang ein schwieriges Wort, denn "Verbindung" in dem Sinn gibt es eigentlich keine. Also schon, aber an die kommst du Serverseitig nicht wirklich dran.
Was du mit .NET Remoting machen kannst, ist einem fremden Prozess zu ermöglichen Objekte einer Klasse in deinem Prozess zu erzeugen, und Funktionen darauf aufzurufen.
D.h. du "merkst" dass eine "Verbindung" besteht dadurch, dass das .NET Framework auf einmal ein Objekt der Klasse "ControlClass" erzeugt, und dann ne Memberfunktion dieses Objekts aufruft.Das Ende der Connection mitzubekommen ist dagegen etwas schwieriger. Gibt einige Ansätze, kannst ja selbst mal zu dem Thema googeln.