[erledigt] Onreceive mit LNet Messageübergabe

Alle Fragen zur Netzwerkkommunikation
Antworten
NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

[erledigt] Onreceive mit LNet Messageübergabe

Beitrag von NoCee »

Hallo zusammen

ich hab ein kleines Problem mit LNet.
Mein Lazarusprogramm empfängt von einer Maschinensteuerung ein paar Dutzend Byte über TCP/IP.
Diese stelle ich zum Teil in Editfeldern dar (Win32 PC). Alles tickt auch ganz brauchbar, aber:

Es kann vorkommen, daß die Maschine in dem Telegramm ein Byte mit hex0 mitschickt, und das aber mittendrin.
Da die Empfangsmetode von LNet "getmessage" einen Nullterminierten String zurückliefert, wird dieses Byte mit hex0 logischerweise
als Stringende interpretiert und der Rest geht mir flöten. Zeichen, die ich auf dem Bildschirm nicht darstellen kann,
gebe ich bisher mit "?" aus. Aber ab hex0 geht halt nichts mehr weiter.

Gibts bei LNet eine Möglichkeit das getmessage so aufzurufen, daß ich die empfangenen Bytes z.B. in einem Array of Byte oder so
bekomme? Das Array könnte ich dann bearbeiten in einen String wandeln und dann anzeigen (mit meinen Fragezeichen wenn nicht darstellbar)
Ich bin im Internet noch auf eine get(...) Methode gestoßen, aber nicht richtig schlau draus geworde, weil in komplizierten Projekten
und halt alles auf Highlevel Englisch.

Über Hilfe würde ich mich tierisch freuen weil ich momentan an diesem Punkt wie festgefrohren bin.
Danke schon mal im Vorraus.

Gruß
NoCee
Zuletzt geändert von NoCee am Mi 25. Apr 2012, 13:01, insgesamt 1-mal geändert.

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Onreceive mit LNet Messageübergabe

Beitrag von Displaced »

Wie wärs mit:

Code: Alles auswählen

var
  adata: array[0..256] of byte;
  ...
begin
...
count := asocket.get(aData, 256);
...

?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Onreceive mit LNet Messageübergabe

Beitrag von MAC »

also ich kann eine Datei in ein String einlesen und verschicken und wieder in einen string mit getmessage einlesen.
Alle #0 chars bleiben erhalten. Selbst ausführbare Programme können bei mir problemlos versendet werden...
Angezeigt im Edit geht das natürlich nicht weil windows es nicht drauf hat, aber im Programm das richtige bekommen (und dann z.B: speicher) sollte kein problem sein...

Code: Alles auswählen

Signatur := nil;

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Onreceive mit LNet Messageübergabe

Beitrag von Displaced »

Das Problem ist sein Nullterminiertes Protokoll. Der wird nur so lange einlesen bis eben ein solches Nullzeichen kommt..
Das ist aber falsch, er muss erst alles einlesen und dann parsen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Onreceive mit LNet Messageübergabe

Beitrag von MAC »

NoCee hat geschrieben:Da die Empfangsmetode von LNet "getmessage" einen Nullterminierten String zurückliefert

Es hört sich so an als würde es meinen "lNet baut hier den Fehler". aber GetMessage Liefert bei mir keine nullterminierten Strings, das wollte ich sagen.
Sicher das du den String nur falsch darstellst ?
gib mal parralet dazu

Code: Alles auswählen

Label1.Caption := InttoStr(length(vonnderNachricht))
aus dann weist du wie lang der String ist, Sollte da 10 Zeichen stehen und du nur 4 sehen, dann ist trotzdem alles ok...

Code: Alles auswählen

Signatur := nil;

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: [erledigt] Onreceive mit LNet Messageübergabe

Beitrag von NoCee »

Hallo

Der Tip mit mit " bei mir kommen die hex0 durch" hat mich dazu veranlaßt, mich nochmals durch die Stringtypen zu fräßen.
Ich habs dann ausprobiert. Für jedes Byte das ich bekomme, habe ich den Hexwert statt dem Zeichen ausgegeben.
Und siehe da, die Anzahl Zeichen die Empfangen werden, und was ich Ausgebe, hat gepaßt. Auch die hex0 wird angezeigt.
Ich hab halt im Netz gelesen, das der übergebene String ein Ansistring sei und der sei nullterminiert.
Ist er scheinbar auch, aber dadruch daß die Länge auch gespeichert wird, kann in der Mitte scheinbar auch eine hex0 stehen.

Somit konnte ich mein Programm so ändern, daß es jetzt das tut was es soll

Mit knappem Text wurde mir unheimlich geholfen
Danke für die Tips

Gruß
NoCee

Antworten