EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include]

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.0][Incl

Beitrag von PMV »

Jo, ich hab so was vor 2 Jahren programmiert bzw. entwickelt,
wobei das komplette Projekt noch lange nicht fertig ist, aber der Teil
ist fast fertig geworden. :lol:
Der Unterschied besteht nur, das ich die Daten über Pipes schicke
zwecks Kommunikation zwischen lokalen Programmen und nicht über
das Netzwerk, aber die zu übertragenden Daten können sich
jeder Zeit ändern, da wollt ich nicht das Protokoll ständig umbauen.

Also der ProtocolManager muss die entgültige Struktur nicht kennen,
der Aufbau wird ja als "Blueprint" eingelesen und genau anhand
dessen kannst du die Werte dann in den Speicher schreiben, so dass
dieser Speicher dann einer Struktur zugewiesen werden kann. Ob
der Programmierer nun alles richtig gemacht hat oder nicht ist ja dann
dir egal bzw. einfach davon ausgehen, dass es passt. Bei mir parsen
"Server" und "Client" eine XML-Datei (die selbe) und ermitteln so
den Aufbau der Datenpakete. Bisschen überdimensioniert, ich weis,
aber die XML-Datei enthält noch mehr Informationen darüber, die
hier jetzt nicht benötigt werden :lol:

Intern müssen die Programme mit den Daten ja arbeiten, daher erwarten
diese eine bestimmte "Struktur". Das heißt die Datenblöcke müssen
eine bestimmte Reihenfolge haben. Alles andere ist großer Overhead und da
das übermitteln der Daten im Hintergrund passieren soll, will ich das
vermeiden. So kann ich auf der Senderseite einfach den Zeiger auf die
Strukturvariable der Sendenfunktion und auf der Empfängerseite werden
die Daten direkt in einer Strukturvariable geliefert. Das ganze arbeitet
natürlich heftigst mit Zeigern und beschreibt bzw. ließt Speicher "zu Fuß",
aber um so kniffliger die Aufgabe um so erfreulicher wenns klappt, oder? :mrgreen:

Da nicht jedes Programm alle Daten braucht, muss für jedes Datenfeld
ein Flag gesetzt werden. Nur wo das entsprechende Flag gesetzt ist,
wird das Datenfelder dann auch übertragen. Es werden also erst mal
die Flags gesendet und anhand dessen dann das tatsächliche Datenpacket
geschnürrt oder ausgelesen. So übertrage ich auch Listen in Listen.
Tatsächlich ist aber trotzdem nur jeweils ein "Send" und "Receive" Befehl
nötig, egal wie komplex das Protokoll ist. Die ganzen "Add_EntryXXX"
und "R_GetXXX" sind ja nicht überflüssig, sie machen das ganze noch
dymaischer für Fälle, wo es tatsächlich machbar ist, aber ich persönlich
find's für die meisten Fälle zu umständlich, weil wie schon gesagt das
Programm so wie so eine genaue Struktur kennen muss, um mit den
Daten überhaupt arbeiten zu können. Bringt ja nichts, wenn z.B. die
Positionsdaten mal in Byte 10 stehen und mal in Byte 5. Der Client
braucht die Daten so oder so im Speicher der Variable "Position"
und wo die liegt ist fest im Programm verankert. Und wenn nun
plötzlich die Logik so verändert wird, das diese Daten garnicht mehr
benötigt werden, muss die Logik des Clients so wie so geändert werden.
Dabei kann dann die zu erwartende Struktur auch angepasst werden.
Das ist ja kein wirklicher Aufwand. Aufwändiger ist es, die ganzen
Add und Get aufrufe neu schreiben zu müssen. :mrgreen:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.0][Incl

Beitrag von cxAlex »

Update V# 1.2.1

Diverse kleine Fehler in den Protokoll-Routinen beseitigt und das ganze Thread-Sicher gestaltet. Optimierungen am generierten Protokoll an sich, weniger Overhead und optional eine intelligente Auswahl der Felder die tatsächlich übertragen werden. Die Objekte an sich brauchen nun weniger Speicher und alles wurde dahingehend optimiert dass das Transceiver-Objekt möglichst wenig zu tun hat und schnell ist.

Die Protokoll-Funktionen wurden vollständig dokumentiert und es gib einen neuen Client-Server Samplecode der über ein kleines Protokoll Username und Passwort usw. überträgt um das Prinzip zu zeigen.

Download im 1. Post

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.1][Incl

Beitrag von cxAlex »

Update V# 1.2.2

Großes Update!

Es wurde wieder mal an der Performance-Schraube gedreht :wink:

Das SafeNetwork - System auf dem ENM basiert wurde komplett überarbeitet und entschlackt. Es benötigt nun keine globale Schutzmutex mehr was den Zugriff aus mehreren Threads darauf spürbar beschleunigt. Dasselbe gilt für die Verwaltung der Connection - Extra Daten. Weiters wurde die Zeit die ein ProtocolTransmitter\T/R_Reset() benötigt halbiert! Außerdem verfügt das gesamte System nun über einen Art GarbageCollector. Sobald ein von ENM erstelltes Object (Paket, Stream, Transceiver, ...) Freigegeben wird wird, erledigt das ENM nun asynchron im Hintergrund, per Compiler-Switch kann man aber wieder auf das alte Verhalten umstellen, programmiertechnisch ergeben sich keine Unterschiede. ENM_DeInit() ist durch diese Maßnahmen bei vielen Connections um ein vielfaches schneller.

Es gibt auch ein paar programmiertechnische Änderungen:
  • Der optionale *CB Parameter wurde aus ENM\OpenConnection() entfernt. War mir schon lange ein Dorn im Auge. Das setzten der Callbacks geschieht nun ausschließlich mit ENM\SetCallbacks(), auf Server- und Client-Seite.
  • Das vID - System wurde aus dem SafeNetwork System ausgebaut da es im Prinzip unnütz war und zulasten der Performance ging.
  • Ein ENM\CloseConnection() löst nun auf Server und Clientseite ein Disconnect - Event aus! Dies erlaubt mir einerseits einige Vereinfachungen an der internen Programmierung, andererseits vereinfacht es den Aufräum-Prozess der Connection-Daten für den Programmierer, da diese Event-Procedure nun auf jeden Fall aufgerufen wird wenn eine Verbindung auf welche Weise auch immer beendet wird.
  • Die Anzahl der gleichzeitigen Verbindungen auf der Client-Seite kann nun künstlich limitiert werden, default ist der Wert auf 250 gesetzt.
Und es wurde ein Mistake-Preventer eingebaut der verhindert das man Netzwerk-Befehle nutzt die man in Kombination mit ENM nicht nutzen sollte und einem den passenden ENM-Befehl vorschlägt.

Download im 1. Post

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
auser
Beiträge: 58
Registriert: 17.05.2011 10:56

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.2][Incl

Beitrag von auser »

Nachdem ich in PB Netzwerkmässig auch schon etwas Frust verbuchen kann und du einen Link im englischen Forum gepostet hast finde ich das hier recht vielversprechend. :)

Was mir aber beim durchstreifen der Kommentare aufgefallen ist daß da standardmässig FastMem verwendet wird. Das aber wiederum lässt das fertige Endprodukt ja automatisch unter die GPL fallen weil dich das Copyleft dazu zwingt? Mhh... Jedoch lässt sich das bei den Settings offensichtlich einfach deaktiveren, was ich gut finde. Das heißt aber dann es würde vermutlich etwas langsamer laufen? :?


Unter welcher Lizenz steht dein eigener Code hier eigentlich? Dürfte man den ohne Einschränkung verwenden (also sofern man FastMem dann deaktiviert hat)?


Mfg,
auser
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.2][Incl

Beitrag von cxAlex »

Naja, eigentlich liefere ich eine unveränderte Kopie der Bibliotheken mit, habe also keine Änderungen vorgenommen und verweise ja auch direkt im Quellcode auf die Urheberseite, insofern sollte das ausreichen (GPL, Absatz 4/ Absatz 6d). Wenn du in deinem Projekt noch einen kleinen Hinweis ins About-Fenster packst dürfte es keine Probleme geben (wenn überhaupt). Sonst kannst du das ganze immer noch per Compiler-Switch abstellen, ich denke nicht das sooo viel Performance verloren geht, die CopyMemory() Befehle in aktuellen OS sind auch sehr schnell :).

Der Code hier steht zur freien Verfügung, aber wenn du das ganze in deinen Projekten verwenden willst würde ich mich halt über einen kleinen Eintrag im About freuen oder bei kommerziellen Projekten über ein kleines Bier über den Donate - Link im Source :wink:

Demnächst (diese Woche?) gibt es das größte Update bisher, einiges an Optimierungen unter der Haube, einige Bug-Fixes aber auch neue Funktionen wie nativer Proxy-Support beim Erstellen der Verbindung oder einen Authentifizierungs-Manager.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: ProtocolManager][V# 1.2.2][Incl

Beitrag von cxAlex »

Update V# 1.3.0

Das größte Update bisher!

Es gibt eine ganze Reihe von BugFixes und kleinen Optimierungen die alle die ENM\CloseConnection() Funktion betrafen, diese läuft nun absolut stabil. Das SafeNetwork System wurde weiter überarbeitet und verbessert, falsche Event-Calls massiv reduziert. Und es wurden 2 sehr selten auftretende Bugs im Zusammenhang mit ProtocolImport() und der Sleep-Funktion der JobQueue behoben. Außerdem kann der Server nun sehr viele Open/Close - Events gleichzeitig wesentlich schneller abarbeiten.

Es gibt auch ein paar neue Funktionen/Detailverbesserungen: Mit ENM\SetCallbacks(#ENM_Default_Callbacks, ...) können Default-Callbacks für alle danach geöffneten Verbindungen/Server definiert werden. Wenn man nun bei einer Client-seitigen Connection ein Connect-Callback definiert wird dieses beim Erstellen der Verbindung aufgerufen, was ein saubereres Programmieren der Initialisierungsroutinen/Deinitialisierungsroutinen ermöglicht. Außerdem kann man per Compilerswitch diesen Workaround aktivieren der einen (angeblichen) Bug in der CloseConnection() Funktion behebt.
Proxy - Support (vorerst SOCKS4/SOCKS5) steht nun über die Funktion ENM\OpenProxyConnection() zur Verfügung. Und nun die größte Neuerung: Das Authentication - System:

Das Authentication System stellt einfache Funktionen zur Verfügung um Benutzer-Anmeldung und Verwaltung zu organisieren. Es können beliebig viele Benutzer angelegt werden, die alle über einen eigenen Benutzernamen, Passwort und eine Berechtigungsstufe verfügen. Per ENMAS\Login() kann sich ein Benutzer einloggen und erhält falls der Vorgang erfolgreich war ein User - Objekt zugewiesen. Wie oft ein Benutzer simultan eingeloggt sein kann (beispielsweise von verschiedenen PCs) kann individuell festgelegt werden. Ist der Login nicht erfolgreich gibt es umfangreiche Informationen warum das so war (UserName/Passwort falsch, User wurde gesperrt, Maximale Login-Anzahl erreicht, ...).

Außerdem gibt es die Möglichkeit einen Authentication - Token zu erzeugen, über den sich ein Benutzer anmelden kann. Pro User ist maximal 1 Token gleichzeitig gültig. Über die Funktion ENMASU\GenerateAccessToken() wird so ein Token erzeugt. Die Funktion nutzt wenn möglich die CryptRandom() Funktionen in Kombination mit SHA1 und MD5 und sollte absolut zufällige Token erzeugen. Jeder Token ist zeitlich begrenzt (Default: 1. Wochen, kann individuell eingestellt werden) und kann auch vom User manuell gelöscht werden. Via ENMAS\LoginPerToken() kann man sich mit diesem Token am System einloggen. Auch für die Token gilt die gleichzeitige Login Beschränkung!

Ist der Benutzer erst einmal eingeloggt kann mit ENMASU\IsSessionValid() geprüft werden ob der User noch gültig eingeloggt ist (Er könnte ja in der Zwischenzeit gesperrt worden sein, bzw. eine System - Panic wurde ausgelöst, dazu später)

Die Administration des Systems erfolgt ebenfalls über einen User. Der Administrator muss sich zunächst anmelden und dann mit der Funktion ENMASU\GetMasterAccess() mit einem Masterpasswort den Admin - Zugriff anfordern. Als zusätzliche Sicherheitsfunktion kann nicht jeder User diesen Zugriff anfordern, der Benutzer muss über Zugriffsrechte >= #ENM_Auth_Operator verfügen, normale User werden Default mit den Rechten #ENM_Auth_User erstellt. Hat der Admin erst einmal diesen Zugriff kann er Benutzer sperren, Berechtigungen für jeden Nutzer ändern, Den Login Count für jeden Nutzer ändern oder die Lebensdauer der Tokens ändern. Außerdem kann er sich in jeden Nutzer einloggen, unabhängig vom Login-Count usw. . Mit der Funktion ENMASU\IsMaster() kann geprüft werden ob der User Master - Zugriff hat und ihm z.B. Zugriff auf Admin-Funktionen für den jeweiligen Server gewähren, bzw. mit ENMASU\GetPermissions() der Zugriff für jede Berechtigungsstufe (User/Operator/Admin) fein eingestellt werden.

Das ganze System hat eine Callback-basierte Import/Export Schnittstelle um den gesamten Benutzer-Bestand inklusive Berechtigungen, Login-Countern usw. in eine Datenbank, INI - File, usw. zu exportieren und wieder zu importieren. Das Gesamte System erforder übrigens zwingend gehashte Passwörter, damit niemand auf die Idee kommt die Passwörter Plain übertragen zu wollen ( :o :shock: ). Dafür steht die Hilfsfunktion ENM_Auth_HashPassword() zur Verfügung. Eine meiner Lieblingsfunktionen ist die ENMAS\Panic() Funktion. Wurde diese Funktion aufgerufen werden alle Sessions ungültig, kein weiterer Login ist möglich. Keine Funktion geht mehr außer Free() und Export(), einfach eine Sicherheitsfunktion falls ein Sicherheitsverstoß festgestellt werden sollte.

Die Auth-Funktionen sind noch nicht voll dokumentiert und es ist viel frischer Source also sind eventuell noch gröbere Fehler enthalten. Wer will kann sich aber die ENM_Authenticate.pbi schonmal ansehen :)

Download im 1. Post

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: EasyNetworkManager [Neu: Authentication][V# 1.3.0][Inclu

Beitrag von c4s »

Ich habe zwar was die Netzwerkbefehle angeht nicht viel bzw. gar nichts am Hut, muss dich aber trotzdem für deine stetige Entwicklung dieses sehr fortgeschrittenen Projekts loben! Zudem ist es noch frei für uns nutzbar und du veröffentlichst sogar den Quellcode. Danke und weiter so! :allright:

Ich kann dir nur empfehlen das ganze nochmal im englischen Forum zu posten, denn da wirst du sicherlich (noch) mehr brauchbares Feedback bekommen. Eventuell wird ja auch Fred darauf aufmerksam und nutzt dies als Chance die PB-internen Netzwerkbefehle in Sachen Thread-Safe etc. zu verbessern. Vielleicht wird dadurch ENM auch Teil von PB... :wink:
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: Authentication][V# 1.3.0][Inclu

Beitrag von cxAlex »

:D
Danke für das Lob, ich tu einfach mein Bestes. Ich hab auch schon dran gedacht das ganze ins Englische Forum zu stellen aber dafür müsste ich zumindest die Befehlsbeschreibung ins Englische übersetzen und ich hinke ja schon mit der Pflege der Deutschen etwas nach :|
Eigentlich plane ich schon seit längerem eine etwas umfangreichere CHM Hilfe, finde aber schlicht keine Zeit dafür. Mal sehen, vielleicht kann ich mich ja irgendwie dazu aufraffen. Es werden halt immer mehr Funtionen/Einstellungen usw. Schon ne Heidenarbeit.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: EasyNetworkManager [Neu: Authentication][V# 1.3.0][Inclu

Beitrag von Andreas21 »

Hi,

habs auf Linux Debian 6 getestet und bekomme volgende fehlermeldung.

Code: Alles auswählen

******************************************
PureBasic 4.60 Beta 3 (Linux - x86)
******************************************

Loading external modules...
Starting compilation...
Including source: ENM.pbi
Including source: ENM_CommandDescription.pbi
Including source: ENM_CommonIncludes.pbi
Including source: Common/FastMem.pbi
Including source: Common/Thread_Std.pbi
Including source: Common/Stack.pbi
Including source: Common/GrowableMemory.pbi
Including source: Common/Ping.pbi
Including source: Common/HashMapEx.pbi
Including source: Common/zLib.pbi
Including source: SafeNetwork_Experimental.pbi
Error: in included file '/root/easy/sample/../src/SafeNetwork_Experimental.pbi'
Line 557 - Structure not found: LINGER.
Unter Win7 x86 keine Probs bis jetzt.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: EasyNetworkManager [Neu: Authentication][V# 1.3.0][Inclu

Beitrag von cxAlex »

Ok, Danke. Ist in der nächsten Version behoben, da musste nur eine Variable noch in die CompilerIF - Section :)

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten