Hi
Also da gibt es eigentlich nur zwei Möglichkeiten
1) ReceiveBuf / SendBuf
2) SendStream / ReadBuf
zu 2) kann ich Dir leider nicht viel sagen, da ich das noch nie probiert habe.
zu 1) Ich habe da folgenden Vorschlag für Dich.
Du baust zwei Typen z.B.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| {$A-} //Erste Zeile der Unit Compilerbefehl ...//Noch Code Type Daten_Typ = Record Prog_Code:Array[0..2] OF Char; User:Array[0..4] OF Char; Comn_Code:Word; Comn_ID:Word; BufLength:Word; Daten:Array[0..1024] OF Byte; End; Speicher_Typ = Array[0..1038] OF Byte; ... //Noch Code VAR dateieing,datenausg : Daten_Typ; datain,dataout : ^Speicher_Typ; ... //Noch Code Procedure ...OnCreate... //Procedure Form1OnCreate BEGIN ...//Noch Code datain := @dateieing; dataout:= @datenausg; ...//Noch Code END; ... //Noch Code |
So
Ich will das jetzt mal kurz erklären.
Der Copilerbefehl {$A-} bedeutet ALIGN OFF. Normalerweise sortiert Delphie Variablen immer so, das gerade Speicheraddressen verwendet werden. Wenn Du jetzt aber mit einer Variable mal eine Addresse nur "halb" füllst, dann werden die nachfolgenden Bit's ignoriert. Deshalb kann es passieren das Deine Variablen mal größer ist und mal kleiner im Register. Wenn man aber später einen Record mit Move in einen Buffer schreiben möchte, das dann versenden muss und der Empfänger muss daraus wieder den gleichen Record machen dann sollte man darauf achten, das die Länge immer genau gleich ist. Also ALIGN OFF an.
Ich habe hier einen Daten_Typ gemacht. Er soll Dir als Beispiel dienen. In Prog-Code werden drei Zeichen abgesendet und das empfangende Programm kann feststellen ob der ganze Datensatz wirklich verstanden wird.
User soll ein Username sein, um eine Eindeutige ID zu haben.
Comn_Code da kannste dann "Befehle" übermitteln, wie z.B. 1 Datei lesen, 2 Datei schreiben, 3 Datei löschen etc.
Comn_ID wenn ein Datensatz länger ist als 1kB dann kannst Du daran immer erkennen an welchen Datensatz der Inhalt von Daten angehängt werden soll
BufLength gibt dir die Länge des Datensatzes in der Variable Daten. Ist Daten mal kleiner als 1kB dann solltest Du natürlich auch nur das kurze Stück verarbeiten, sonst hast Du Datenmüll dazwischen.
Der Speicher_Typ ist genauso lang wie der Record. Prog_Code sind 3 Byte, User 5 Byte, Comn_Code, Comn_ID und BufLength jeweils 2 Byte und dann natürlich Daten mit 1025 Byte. Ergebniss 1039 Byte von 0 bis 1038
Dann kommen die Variablen zu den Typen, Achtung datain,dataout sind Pointer.
Jetzt kommt aber der eigentliche Trick. Im ONCreate verbindest du die PointerVariable mit den Speicheraddressen der RecordVariablen. Ergebniss: Du greift mit zwei Variablennamen auf den gleichen Dateninhalt zurück.
So
bei SendBuf(dataout,1039) sendest Du jetzt den Inhalt des Records zum Server oder Client
mit ReceiveBuf(datain,1039) empfängst Du in der Procedure serversocket1OnClientRead bzw. ClientSocket1OnRead den Datensatz, da der Record mit den Variablen verknüpft ist, ist der Inhalt damit auch sofort im Record für Dich abgreifbar.
Ich hoffe, das Dir das etwas weiterhilft. Natürlich kannst Du den Record anders aufbauen, must jedoch den Speicher_Typ mit der größe mitführen damit der Record auch hineinpast.
cu Patmann