Entwickler-Ecke

Internet / Netzwerk - Problem mit UDP


hui1991 - Mi 10.05.06 06:57
Titel: Problem mit UDP
Also ich mache ein Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var
  MyStream2: TMemoryStream;
  wert: String;
  endwert: Integer;
begin
  MyStream2 := TMemoryStream.Create;
  try
    NMUDP1.ReadStream(MyStream2);
    SetLength(wert, NumberBytes);
    MyStream2.Read(wert, NumberBytes);
    endwert:=StrToInt(wert[1]);
    Label15.Caption:=IntToStr(endwert);
  finally
    MyStream2.Free;
  end;
end;

Dabei kommt das hier noch:

Quelltext
1:
2:
Exception EAccessViolation in Modul ABC.exe bei 00002C9C.
Zugriffsverletzung bei Adresse 00402C9C in Modul 'ABC.exe'. Lesen von Adresse FFFFFFFF.


Wenn es ausgeführt wird, wird entweder MyStream2.Free zwei mal ausgeführt oder es kommt eine Access Violation. Ich weis leider nicht warum :(

MfG
hui1991


Narses - Mi 10.05.06 09:28

Moin!

Ich kenn die Kompo NMUDP nicht, aber kennst du diese Kompo [http://www.delphi-forum.de/topic_TUdpSockUtil+V100++Alternative+zum+IndyUDPClientServer_55339.html]? Vielleicht kommst du damit ja besser klar, da brauchst du keine Streams. ;)

cu
Narses


Stefan.Buchholtz - Mi 10.05.06 10:11

Der Fehler liegt beim Lesen aus dem Stream in den String - TStream.Read schreibt die gelesenen Daten direkt in die übergebene Variable. String ist aber intern ein Zeiger auf den String. Mit Read wird also der Zeiger und (wenn mehr als 4 Bytes gelesen werden) andere lokale Variablen und sonstige Daten auf dem Stack überschrieben.

So ist es richtig;


Delphi-Quelltext
1:
MyStream2.Read(PChar(wert)^, NumberBytes);                    


Stefan


hui1991 - Mi 10.05.06 16:19

Ich kenne dieses Problem nicht:

Quelltext
1:
Im Projekt ABC.exe ist eine Exception der Klasse EConvertError aufgetreten. Meldung: ''                    


Hab den code so angepast wie es sein sollte.
Weis nicht woran das liegt.


Stefan.Buchholtz - Mi 10.05.06 16:32

Das sieht so als ob StrToInt fehlschlägt. Hast du mal überprüft, ob du überhaupt Daten bekommst und wie die aussehen?

Stefan


BenBE - Mi 10.05.06 16:39

Der Fehler liegt in Zeile 12. Dort muss es heißen MyStream.ReadBuffer(wert[1], NumberOfBytes);

Die zweite Änderung bzgl. Read und ReadBuffer betrifft einzig und allein die Fehlerkorrektur: ReadBuffer löst eine Exception aus, wenn die angeforderte Datenmenge nicht gelesen werden konnte.


hui1991 - Mi 10.05.06 17:00

Genau das ist das Problem.
War ein wenig zu lahm das noch hin zuschreiben.
Dummer weise kommt nur das hier raus:
wert: #0'ÜE'#0' J'
Ich weis nicht warum
Ich habe eigentlich 1Hallo geschrieben.
Keine Ahnung warum das falsch angezeigt wird.