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
[erledigt] Onreceive mit LNet Messageübergabe
-
- Beiträge: 174
- 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
Zuletzt geändert von NoCee am Mi 25. Apr 2012, 13:01, insgesamt 1-mal geändert.
Re: Onreceive mit LNet Messageübergabe
Wie wärs mit:
?
Code: Alles auswählen
var
adata: array[0..256] of byte;
...
begin
...
count := asocket.get(aData, 256);
...
-
- 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
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...
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;
Re: Onreceive mit LNet Messageübergabe
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.
Das ist aber falsch, er muss erst alles einlesen und dann parsen.
-
- 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
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.NoCee hat geschrieben:Da die Empfangsmetode von LNet "getmessage" einen Nullterminierten String zurückliefert
Sicher das du den String nur falsch darstellst ?
gib mal parralet dazu
Code: Alles auswählen
Label1.Caption := InttoStr(length(vonnderNachricht))
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 174
- 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
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
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