Wie ein Array übers Netzwerk senden?

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Wie ein Array übers Netzwerk senden?

Beitrag 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?
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Wie ein Array übers Netzwerk senden?

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Wie ein Array übers Netzwerk senden?

Beitrag 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.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Wie ein Array übers Netzwerk senden?

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie ein Array übers Netzwerk senden?

Beitrag 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.
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Wie ein Array übers Netzwerk senden?

Beitrag 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
Antworten