Seite 1 von 1

Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 13:44
von Syntacks_Error
Ich möchte den Inhalt eines Arrays (die einzelnen Elemente haben eine feste Länge) per SendNetworkData(Verbindung, *SpeicherPuffer, Laenge) versenden.

Am einfachsten wäre es natürlich, einfach die Adresse des Arrays als *SpeicherPuffer und die Anzahl der Elemente * ihre Größe als Laenge zu nehmen. Dann bräuchte ich das Array nicht extra auszulesen und separat in den *Speicherbuffer zu schreiben.

Geht das? Voraussetzung wäre ja, daß das Array linear von Anfang bis Ende in einem Stück im Speicher liegt. Ist das gewährleistet? Insbesondere auch noch nach einem vergrößernden Redim?

Re: Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 14:15
von CSHW89
Dass das Array in einem Stück ist, ist gewährleistet. Allerdings gibt es da ein anderes Problem, falls das Array aus Strings besteht, oder das Array strukturiert ist, und in der Struktur Strings, Arrays, Listen oder Maps sind, wird jeweils nur die Adresse kopiert und gesendet. Auf einem anderen Computer ist diese Adresse dann nicht aktuell.

lg kevin

Re: Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 14:39
von Nero
Syntacks_Error hat geschrieben:Geht das?
Ja es geht aber nur wen das array eine einfache structure hat.
Hier ein kleiner code als denkanstoß

Code: Alles auswählen

Dim test.l(2)
test(0) = 123
test(1) = 1234
test(2) = 12345

ArrayLen.l = (PeekL(@test(0) - 8)  * SizeOf(long)) + 8

*tmpArray = AllocateMemory(ArrayLen)
CopyMemory(@test(0) - 8, *tmpArray, ArrayLen) 

Dim NewArray.l(PeekL(*tmpArray))
CopyMemory(*tmpArray, @NewArray(0) - 8, ArrayLen) 

Debug NewArray(2)

Aber es ist wie CSHW89 gesagt hat es dürfen keine strings/listen usw drin sein

Warum erstellst du dir aus deinem Array nicht einfach ein XML document da kannste alles was du brauchst unterbringen und bequem versenden.

Re: Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 15:19
von Syntacks_Error
Bei mir geht es nur um ein simples Byte-Array, dann geht es also. XML? So'was gab's früher auch nicht, also wofür soll das gut sein ;-) (Alter Hund und so) Außerdem ändern sich einige array-Werte gelegentlich zur Laufzeit, und das zu übermittlen (natürlich nur die jeweils geänderten Werte) soll der Sinn der Sache sein.

Re: Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 15:23
von STARGÅTE
Für die Übertragung ein XML-Baum zu erstellen ist quatsch.
Erstens wird es dadurch extrem langsam und die übertragung ist ehr schwerer.

Dein Beispiel ist auch etwas schräg, bitte benutze doch die in PB dafür vorgesehenden Befehle:
ArraySize() und ReDim ... anstatt in den Header des Array "rum zu fuschen".

Mag sein, das sich dieser bis auf weiteres nicht ändert, sollte er es aber tuen, hat man n menge Probleme weil die Übertragung dann nicht mehr Funktioniert, weil zB die Anzahl der Felder nicht mehr ja -8 steht ...

Zu den Strings, am einfachsten kann man es sich machen, indem man Fix-String nutzt, das geht, wenn man in etwas weiß, das alle String maximal eine Länge von 32 Bytes oder so haben, zB wenn es um Namen geht oder so ...
Ansonsten, muss man doch einen extra Speicher reservieren in dem man dann Daten und die Strings einträgt.

Re: Wie ein Array übers Netzwerk senden?

Verfasst: 03.04.2011 20:10
von Nero
STARGÅTE hat geschrieben:Für die Übertragung ein XML-Baum zu erstellen ist quatsch.
Erstens wird es dadurch extrem langsam und die übertragung ist ehr schwerer.

Dein Beispiel ist auch etwas schräg, bitte benutze doch die in PB dafür vorgesehenden Befehle:
ArraySize() und ReDim ... anstatt in den Header des Array "rum zu fuschen".

Mag sein, das sich dieser bis auf weiteres nicht ändert, sollte er es aber tuen, hat man n menge Probleme weil die Übertragung dann nicht mehr Funktioniert, weil zB die Anzahl der Felder nicht mehr ja -8 steht ...
Ok XML ist wahrscheinlich nicht das schnellste aber die Übertragung ist damit nicht schwerer als wen er den Array übers Netzwerk schickt.
Einen kleinen Client/Server Code muss er so oder so schreiben. :wink:

Hm ja das Beispiel ist etwas schräg aber soweit mir bekannt steht schon eh und je die Größe des Arrays 8 Byte vor dem ersten Element
daher ändern sich die -8 nicht wirklich oder hat sich da was in letzter zeit geändert? :?

Zudem ist wen man den Array im Speicher durchgeht das nächste Element an der stelle zu finden an der die Structure endet in dem Fall ein long also 4 Bytes,
mir ist bisher noch nie aufgefallen das PB intern einen Array anders gespeichert hat und ihn eventuell im Speicher verteilt.
(Kann mich da aber auch irren dann wäre es natürlich fatal einfach so zu überschreiben :lol:)

ArraySize() und ReDim fallen hier ja weg weil der Array der überschrieben wird eh erst beim Client der es empfängt erstellt werden muss also kann man hin auch
gleich in der gebrauchten Größe erstellen und dann einfach mit dem empfangen Array überschreiben.
Ok man muss nicht wirklich den Header mit überschreiben.

Ich gehe wie gesagt davon aus das PB seine Array linear speichert und sie nicht im Speicher verteil, davon ausgehend ist es völlig ok den Array mit einem satz
Daten gleicher Structur und Länge zu überschreiben :twisted:

Ok wen er natürlich den Array beim Client nicht einfach nur neu mit den gleichen Werten des Server erstellen will
dann sieht die Sache etwas anders aus aber so wie ich ihn verstanden habe will er einfach einen Array vom Server zum Client 1 zu 1 übertragen.



==================================================
Asche auf mein Haupt :oops:
Syntacks_Error hat geschrieben:Bei mir geht es nur um ein simples Byte-Array, dann geht es also. XML? So'was gab's früher auch nicht, also wofür soll das gut sein ;-) (Alter Hund und so) Außerdem ändern sich einige array-Werte gelegentlich zur Laufzeit, und das zu übermittlen (natürlich nur die jeweils geänderten Werte) soll der Sinn der Sache sein.
Hab glat seine Antwort übersehen :cry:

Hm wen du nur ab und an was andern willst könntest du einfach jedes Array Element nummerieren und rüber schiecken.
Was ich meine ist du kopierst einfach die benötigten Elemente in einen erstellten Speicherbereich aber stellst jedem
Element noch einen Longwert voran in dem die Position gespeichert ist.
Dann kannst du nach dem empfangen einfach wieder das ganze durchgehen und kannst anhand der Positionen deinen Array ändern