Autor Beitrag
Ja-Pa
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 23.10.05 16:42 
Hallo,

ich möchte einen Record vom ClientSocket zum ServerSocket übertragen. Dazu verwende ich Socket.ReceiveBuf(Recordvariable, Socket.ReceiveLength);, da mir die Größe des Records nicht bekannt ist.
Wenn ich nun aber auf ein Element des empfangenen Records zugreifen möchte, bekomme ich eine Zugriffsverletzung. Woran liegt das? Kann ich ReceiveLength hier nicht verwenden?

Vielen Dank,
Ja-Pa

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: So 23.10.05 17:36 
1. ReceiveLength() gibt die aktuell empfangenen Bytes an - das kann mehr oder auch weniger als der Record sein
2. Es ist nirgendwo gewährleistet, das der Record als Ganzes sofort übertragen wird. Es ist gut möglich, das du 2 oder mehr OnClientRead Aufruf bekommst, bevor der Record als ganzes bei dir angekommen ist.
3. Bei deinem ReceiveBuffer() gibst du doch eine Variable vom Typ des Records an - also wieso solltest du dann die Grösse des selbigen nicht kennen?
ausblenden Delphi-Quelltext
1:
2:
If Socket.ReceiveLength >= SizeOf(MeinRecord) Then
  socket.receivebuf(MeinRecord, SizeOf(MeinRecord));

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 23.10.05 19:30 
Funktioniert das auch, wenn ich Variants im Record benutze? Denn je nach dem, welchen Varaiablentyp die Variants erhalten, sind die doch unterschriedlich groß, oder?

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 23.10.05 20:14 
Dein Code führt leider weiterhin zu einem Zugriffsfehler - und das sogar, wenn der Record nur einen einzigen String und keine Variants enthält... aber Strings sind doch auch immer unterschiedlich groß? Ich kann doch gar nicht wissen, wie groß der Record ist, bevor ich ihn nicht empfangen habe?

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: So 23.10.05 21:43 
Oha, da tun sich ja Abgründe auf...

1. Ein Record ist immer bekannt von der Grösse. Der Compiler nutzt das als "Maske" für die Strukturierung von Speicher. Dieser Record hat eine feste Grösse, die zur Compilierung feststeht.

2. Ein String ohne Längenangabe ([20]) und nicht vom Typ ShortString, ist ein AnsiString. Ein AnsiString ist ein Zeiger und somit 4 Bytes gross. Wenn du also einen Record hast wo ein Typ String drinne ist, dann ist der 4 Bytes gross und enthält nur die Adresse im Speicher wo der String steht - und die Adresse ist bei deinem empfangenden Programm bestimmt nicht die gleiche - ganz davon zu schweigen, das der Inhalt fehlt.

3. Bei einem Variant ist es ganz ähnlich: Du hast den Typ vorne stehen im Speicher und danach bei den meisten Typen eine Adresse wo die Daten stehen.

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: So 23.10.05 22:54 
Oh danke :wink:
Wie übertrage ich denn dann einen String? ShortStrings sind leider zu kurz.
Einen einzelnen String könnte man in einem Stream speichern und den Stream verschicken. Aber funktioniert das auch mit einem Record?

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 23.10.05 23:26 
Moin!

Hast du schon mal die Forums-Suche benutzt? Solltest du... :wink:

Ich rate wie immer in diesem Fall zu einem Protokoll, einfach mal hier nach diesem Wort suchen. :roll:

Und um die Frage zu beantworten:

ausblenden Delphi-Quelltext
1:
Socket.SendText();					


cu
Narses
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Mo 24.10.05 12:10 
Oder einfach vorher die Länge des Strings senden - z.B. in Form eines Integer der dann einfach jedem String als Präfix vorausgeht und danach dann in der angegebenen Länge der String.

Als Beispiel kannst du dir ja mal den Chat auf meiner HP anschauen - dort wird gleiches gemacht... (und er nutzt ein Protokoll, ist unumgänglich)

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Ja-Pa Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 458

Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
BeitragVerfasst: Mo 24.10.05 15:39 
Danke für die Antworten. Die Suche nach "Protokoll" hat mich dann weitergebracht.
Ich werde jetzt keinen Record verschicken, sondern Befehl und Parameter in einem String mit Trennzeichen getrennt, wie in diesem Thread beschrieben.

_________________
Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.