Autor Beitrag
knittel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Mi 04.04.12 12:35 
Hallo allerseits,
Ich würde gerne die Daten von verschiedenen Objekten eines Spiels über das Netzwerk transportieren.
Ich habe mir schon ein kleines Netzwerk-Protokoll (nach dem TerminatorZeichen-Protokoll Tutorial von Narses) aufgebaut.

Wenn ich ein Objekt versende gibt es folgende Syntax:
'receive' , <Team> , <Class> , <Buffer>
receive als Schlüsselwort,
Team für das Team der Einheit, (muss ich wissen, damit ich das Objekt in der richtigen Liste erzeuge).
Class der Klassenname des Objektes als String.
Im Buffer soll dann vom Pointer des Objekts X Bytes gelesen werden, wobei X der InstanceSize des Objekts entspricht und dieser Buffer soll dann versendet werden.
Beim Empfangen soll dann dieser Buffer, nachdem ein Objekt dieser Klasse erzeugt wurde, in das neue Objekt geschrieben werden.

Jetzt 2 Fragen:
1. Funktioniert das überhaupt so, wie ich mir das vorgestellt habe?
2. Wenn ich den Buffer über die Sockets gelesen habe, wie kann ich diesen dann in das Objekt schreiben?

P.S. (Ich habe nicht vor für jede Klasse eine eigene Sende-Funktion/Empfangs-Funktion zu programmieren, da ich insgesamt 110 Klassen verwalte. Wenn es eine einfachere Möglichkeit gibt wäre ich sehr sehr glücklich!)

Moderiert von user profile iconNarses: Titel erweitert.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 04.04.12 16:02 
Moin!

user profile iconknittel hat folgendes geschrieben Zum zitierten Posting springen:
Im Buffer soll dann vom Pointer des Objekts X Bytes gelesen werden, wobei X der InstanceSize des Objekts entspricht und dieser Buffer soll dann versendet werden.
Beim Empfangen soll dann dieser Buffer, nachdem ein Objekt dieser Klasse erzeugt wurde, in das neue Objekt geschrieben werden.
[...]
1. Funktioniert das überhaupt so, wie ich mir das vorgestellt habe?
Wenn dein Objekt ausschließlich aus nativen Datentypen besteht, die direkt im Speicherbereich des Objektes verwaltet werden, dann mag das klappen - für eine gute Idee halte ich das trotzdem nicht. :nixweiss: Sobald du aber z.B. einen (Ansi)String oder andere Objekte in einem deiner Objekte verwaltest, kannst du das gleich vergessen, da die Daten nicht an der Stelle im Speicher stehen, die du versenden willst. :idea: Hier ein FAQ-Eintrag dazu. :les:

user profile iconknittel hat folgendes geschrieben Zum zitierten Posting springen:
2. Wenn ich den Buffer über die Sockets gelesen habe, wie kann ich diesen dann in das Objekt schreiben?
Du kannst ja einfach mal per System.Move() an die Adresse der Instanz schreiben und hoffen, dass das System nicht crashed. :? Wie schon gesagt: lass das lieber... :hair:

user profile iconknittel hat folgendes geschrieben Zum zitierten Posting springen:
P.S. (Ich habe nicht vor für jede Klasse eine eigene Sende-Funktion/Empfangs-Funktion zu programmieren, da ich insgesamt 110 Klassen verwalte.
Die Standard-Lösung für sowas ist eine De-/Serialisierungsfunktion in der Klassenhierachie zu verankern und dann die Objekte serialisiert durch den Socket zu schieben. :think: Stell dir einfach vor, du willst das ganze in eine Datei tun und beim nächsten Programmstart wiederherstellen, was anderes ist eine Netzwerkdatenübertragung auch nicht - nur schneller. ;) Anderes Beispiel: die IDE tut sowas beim Laden/Speichern der Objekte eines Formulars auch - man kann eben keine Klassen im Speicherlayout schreiben und lesen, das wird nix. Echt. :|

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
knittel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Mi 04.04.12 21:21 
Danke erstmal für die schnelle Antwort.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Die Standard-Lösung für sowas ist eine De-/Serialisierungsfunktion in der Klassenhierachie zu verankern und dann die Objekte serialisiert durch den Socket zu schieben.

Grundsätzlich hab ich eine Hierachie aufgebaut. Ich glaub es wäre sinnvoll die Daten zu begrenzen und nur das nötigste zu verschicken (Grafik-Einstellugen, etc. weglassen), dürfte sowieso nicht auffallen und dann für die Klassen eine Sende, bzw, Empfangfunktion zu schreiben.

Kurz gesagt, um die Arbeit komm ich nicht rum. :bawling:

Aber trotzdem vielen Dank, auch für den FAQ Eintrag hat mir sehr weitergeholfen. :zustimm:

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."