ich will via "internet" zwischen 2 Lazarus Instanzen Kommunizieren dazu verwende ich normalerweise lNet, aber da das wohl keine Verschlüsselung kann, und es schon "sicher" sein sollte, habe ich mich nun dazu entschieden mittels Synapse das lNet interface nach zu bauen (Denn unter Synapse geht ssl anscheinend).
Dazu habe ich mir eine TSynapseComponent gebaut, die ähnlich zu lNet methoden wie
Code: Alles auswählen
OnAccept: TSocketEvent;
OnConnect: TSocketEvent;
OnDisconnect: TSocketEvent;
OnError: TSocketErrorEvent;
OnReceive: TSocketEvent;
Damit ihr euch im Code zurecht findet.
der Server wartet im TAcceptThread auf hereinkommende Anfragen, kommt eine übergibt er den Socket an TSynapseComponent dieser verwaltet diesen dann als "client"
der Client verbindet sich direkt als Client und übergibt dann ebenfalls den Socket an TSynapseComponent dieser verwaltet diesen dann als "client"
Beides wird mittels InternalAddClient gemacht.
InternalAddClient wiederrum verschiebt den Socket in einen eigenen Thread, so dass diese den Hauptthread nicht blockieren, daraus ergibt sich dann folgender Execute code für den TClientThread:
Code: Alles auswählen
Procedure TClientThread.Execute;
Begin
// Setup:
// Nichts zu tun der Erzeuger dieses Threads hat
// FOwner, FSocket bereits korrekt initialisiert ;)
FConnection := TSynapseConnection.Create(FOwner, FSocket, fID);
// Optional: SSL-Handschake
If FOwner.UseSSL Then Begin
Case FOwner.fMode Of
mServer: Begin
FSocket.SSL.CertificateFile := FOwner.SSLCertFile;
FSocket.SSL.PrivateKeyFile := FOwner.SSLKeyFile;
If Not FSocket.SSL.Accept Then Begin // Der Server Triggert ein Accept ? ist das überhaupt Richtig ?
Synchronize(@SSLErrorClient);
Terminate;
exit;
End;
End;
mClient: Begin
FSocket.SSL.CertCAFile := FOwner.SSLCAFile; // optional
FSocket.SSLDoConnect(); // Der Client will verbinden
End;
End;
If FSocket.SSL.LastError <> 0 Then Begin
Synchronize(@SSLErrorClient);
Terminate;
exit;
End;
End;
// Der Server hat einen neuen Client akzeptiert
If FOwner.fMode = mServer Then Begin
Synchronize(@AcceptClient);
End;
// Wir sind erfolgreich mit dem Server verbunden
If FOwner.fMode = mClient Then Begin
Synchronize(@ConnectClient);
End;
// Execute
While Not Terminated Do Begin
If (FSocket <> Nil) And FSocket.CanRead(PollTimeoutms) Then Begin
If (FSocket = Nil) Or (FSocket.WaitingData = 0) Then Begin
Synchronize(@RemoveClient);
End
Else Begin
Synchronize(@ReadData);
End;
End;
If assigned(FSocket) And (FSocket.LastError <> 0) Then Begin
Synchronize(@ErrorClient);
Terminate;
End;
sleep(1);
End;
// Teardown
If assigned(FOwner) Then Begin
Synchronize(@RemoveClient);
End;
End;
Tante Google hat mir leider nichts vernünftiges zum Thema "Demo" / "Example" gegeben und ChatGTP dreht sich im Kreis
Hat einer von Euch ein paar nützliche Ideen / Anregungen wie ich das noch retten könnte ?