Seite 14 von 15
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 12.07.2011 23:58
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

. 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
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 02.08.2011 02:16
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.
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 02.08.2011 02:20
von STARGÅTE
Seit 4.60 ist der 3. Parameter (Startposition) optional.
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 21.08.2011 00:26
von Codusa
Erstmal ein riesiges DANKE!
ENM ist, was man schon wollte ohne es zu wissen

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?
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 21.08.2011 00:48
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
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 21.08.2011 11:00
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
NetEvent_RecData ist da falsch oder liegts an mir?
--EDIT--
Grad gemerkt, es liegt an mir

Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 26.08.2011 18:39
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 -...-
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 27.08.2011 12:49
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
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 27.08.2011 15:12
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
durch
ersetzt
Re: EasyNetworkManager [Neu: Log - System][V# 1.3.3][Include
Verfasst: 27.08.2011 16:56
von cxAlex
Hm, ich sehs mir mal an. Hab leider Momentan fast keine Zeit zum coden, aber ich merks vor.
Gruß, Alex