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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Nein, sowas gibt's leider (noch) nicht. Ich konnte mich noch nicht entscheiden wie ich das am besten löse (Eben mit der GetNext() Methode, aber da müsste ich die gesamte Liste intern Locken (etwa zwischen einem StartIteration()/EndIteration() Block) damit sich nicht ständig intern der Listen-Eintrag ändert und Clients gar nicht bzw. doppelt gewertet werden was sehr Performance-Lastig währe, oder ich erlaube das extrahieren als lokale Kopie der Client-LL, aber das könnte inkonsistente Daten ergeben (Clients trennen/verbinden sich während man mit der lokalen Liste arbeitet) . Ich denke ich werde eher die 2. Möglichkeit einbauen da die ENM-Befehle ohnehin gegen ungültige Client-IDs durch das SafeNetwork - System abgesichert sind.

Jup, um das Arbeiten mit Mutexen kommt man bei Threads eigentlich nicht rum, besonders im Zusammenhang mit den PB-Bibliotheken. Das setzen der Thread-Safe Option in den Compiler Optionen ist leider nicht alles :wink:. Wenn du dich noch nicht so intensiv mit Threads beschäftigt hast würde ich dir raten dir zumindest etwas über Dead-Locks und Race-Conditions anzulesen (zum Verständnis reicht Wikipedia allemal), damit kann man leicht einige typische Anfängerfehler im Zusammenhang mit Threads vermeiden.

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
kevv
Beiträge: 31
Registriert: 28.11.2010 15:52

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

Beitrag von kevv »

hmm
wenn ich die demos teste, egal welche

Fehler
ENM_ProtocolCommons.pbi
fehler zeile128 findstring() falsche zahl an Parametern

While FindString(Protocol$, Chr(32) + Chr(32))

laut Hilfe braucht der FindString 3 parameter, warum hast du nur 2 ???

oder ist es seit 4.60 anders? hab noch die 4.51 drauf.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag von STARGÅTE »

Seit 4.60 ist der 3. Parameter (Startposition) optional.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

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

Beitrag von Codusa »

Erstmal ein riesiges DANKE!
ENM ist, was man schon wollte ohne es zu wissen :D aber wenn mans hat, kommt nicht mehr davon los.

Mir ist allerdings aufgefallen, dass Events "durcheinandergeworfen" werden, die JobQueue also vllt nicht korrekt ist?
Im Sample Client.pb in Verbindung mit Server.pb:
beim Debugfenster kann mans sehen.
Am Anfang Client:

Code: Alles auswählen

C: 37603608
Client_Rec : 37603608 Danke für die Antwort :)
C: 37603752
Client_Rec : 37603752 Danke für die Antwort :)
C: 37603896
Client_Rec : 37603896 Danke für die Antwort :)
Und am Ende:

Code: Alles auswählen

Client_Rec : 275367944 Danke für die Antwort :)
Client_Rec : 380567936 Danke für die Antwort :)
C: 839734040
C: 380568512
Client_Rec : 380568032 Danke für die Antwort :)
Client_Rec : 380568128 Danke für die Antwort :)
Client_Rec : 380568416 Danke für die Antwort :)
C: 836400424
Beim Server siehts von Anfang an so aus:

Code: Alles auswählen

Server_ClientConnect 66514336 1
Server_ClientConnect 66516024 1
Server_ClientConnect 35767952 1
Server_ClientConnect 35767920 1
Server_ClientConnect 36030776 1
Server_ClientConnect 36032408 1
Server_ClientConnect 67547528 1
Server_ClientDisconnect 35767920 1
Server_ClientConnect 67547592 1
Server_ClientDisconnect 36032408 1
Server_ClientDisconnect 36030776 1
Server_ClientDisconnect 35767952 1

Das könnte bei vielen Clients, die viele Events produzieren, zu Problemen führen... Eventuell auch beim ServerLog?
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Es ist nur die Debug Ausgabe nicht synchronisiert. Wenn man jedes Debug mit einer globalen Mutex ummanteln würde würde die Reihenfolge auch wieder passen.

Grund, 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
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

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

Beitrag von Codusa »

Da bin ich ja beruhigt :)
In der Logfile ist mir auch noch was aufgefallen:
Wenn ein Client connected wird erstmal ein "Danke für die Antwort" gesendet. Im Log steht dann aber

Code: Alles auswählen

NetEvent_RecData: Client Send Data: 67300480
NetEvent_RecData ist da falsch oder liegts an mir?

--EDIT--

Grad gemerkt, es liegt an mir :D
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

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

Beitrag von Codusa »

Wie kann ich eine Datei vom Server an den Client senden(und umgekehrt)? Gibt es dafür eine eigene Funktion oder muss ich das mit dem Stream machen?

Code: Alles auswählen

Procedure NetEvent_RecFile(Server, Client)
  ; ...
  
EndProcedure
Dies wird ja bei einem Stream nicht verwendet, und nun frage ich mich ob es eine SendFile() Funktion gibt?
SendPaket() liegt auf der Hand, ich weiss, allerdings habe ich keine Ahnung, wie der Parameter *Memory auszusehen hat, damit
beim Gegenüber das entsprechende RecFileEvent ausgelöst wird -...-
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Solltest mit einem Stream machen, das ganze im Memory-Callback. Das File-Callback ist nur für den #PB_NewtworkEvent_ReceiveFile Parameter da, das sollte man aber nicht verwenden, wird ws in einer der nächsten PB Versionen rausfliegen (hoffentlich).

Für die Verwendung von Streams (sogar zum Dateiversand) ist ein Beispiel im Paket enthalten.

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
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

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

Beitrag von Codusa »

Ok, ich habe jetzt allerdings einen IMA beim Streamen... :(

Code: Alles auswählen

Procedure NetEvent_Connect(Server, Client)
  myLogger\Log(#PB_Compiler_Procedure, #Logger_Info, "Client Connect: " + Str(Client))
  ENM\SetConnectionData(Client, 1)
  PrintN("ClientConnected " + Str(Client) + " " + Str(ENM\GetConnectionData(Client)))
  PrintN("TempUser: " + Str(Client) + " NonMaster")
  ; Stream öffnen
Define Stream.ENM_Stream = ENM\OpenStream(myConnection)

Define *Mem, MemSize, hFile, File$

; Datei in speicher
File$ = OpenFileRequester("Datei Streamen", "", "*.*", 0)
If File$
  hFile = ReadFile(#PB_Any, File$)
  If hFile
    MemSize = Lof(hFile)
    *Mem = AllocateMemory(MemSize)
    If *Mem
      ReadData(hFile, *Mem, MemSize)
    EndIf
    CloseFile(hFile)
  EndIf
EndIf  

If *Mem
  
  ; Stream senden
  If Stream\SendMem(*Mem, MemSize) ; ############### IMA ReadError @0
    
    ; wartem bis der Stream gesendet wurde
    Repeat
      Select Stream\WaitForEvent()
        Case #ENM_Stream_Send_Part
          Debug "Send "+StrD(Stream\S_GetSentMemSize()/Stream\S_GetTotalMemSize()*100,2)+ " %"
        Case #ENM_Stream_Closed, #ENM_Stream_ConnectionClosed, #ENM_Stream_Send_LastPart
          Debug "Send "+StrD(Stream\S_GetSentMemSize()/Stream\S_GetTotalMemSize()*100,2)+ " %"
          Break
      EndSelect
    ForEver
  EndIf
  ; Speicher freigeben
  FreeMemory(*Mem)
EndIf


; Stream freigebn
Stream\Free()
EndProcedure
Das Streambeispiel funktioniert leider nicht (mehr).
Der client beendet sich mit der Debug Meldung "0.00% send"
PB ssagt dazu nur Execution finished...

Ich habe vorher im Beispiel

Code: Alles auswählen

R_GetMemSize
durch

Code: Alles auswählen

 R_GetreceivedMemSize
ersetzt
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Hm, ich sehs mir mal an. Hab leider Momentan fast keine Zeit zum coden, aber ich merks vor.

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