Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem: TMemoryStream und JPEG Netzwerküberwachungssoftware (https://www.delphipraxis.net/76722-problem-tmemorystream-und-jpeg-netzwerkueberwachungssoftware.html)

LAWn-M0W3R 22. Sep 2006 09:40

Re: Problem: TMemoryStream und JPEG Netzwerküberwachungssoft
 
Ich hab ja versucht das ganze nochmal umzuformen und zu verstehen, aber es klappt eben nicht!
Die Indys kann ich nicht nehmen, weil meine Delphi-Version (6 Personal) mir immer einen Fehler ausgibt, wenn ich die Packages einlesen will. Dann habe ich noch eine Trial-Version von BDA 2006, aber die läuft eben nur 30 Tage und dann muss ich sie wieder reinstallieren! Wenn jemand einen Link zu einer guten Version (mit Crack oder Serial) oder vielleicht einen Crack oder eine Seriennummer für BDA 2006 für mich hat, wäre ich sehr dankbar!

Muetze1 22. Sep 2006 11:06

Re: TMemoryStream, JPEG-Übertragung: Bitte helft!
 
Zitat:

Zitat von LAWn-M0W3R
Delphi-Quellcode:
If Log.Lines[Log.Lines.Capacity -1]='#SCREENOK'
then
 begin
  try
  Socket.SendBuf(Stream, Stream.Size);
  Stream.Clear;
  FreeAndNil(Stream);
  FreeAndNil(JPG);
  except
  end;
 end;
end;

1. Log.Lines.Capacity ist was anderes als Log.Lines.Count. Überprüfe deinen Code und korrigiere diesen Umstand und konsultiere die Hilfe dazu!
2. SendBuf() nimmt keine Instanzen. Hier sendest du ab der Instanzenadresse Stream und nachfolgend alle Daten bis Stream.Size des Speichers, aber nicht des Streams.
3. Stream.Clear bringt vor einem Free irgendwie gar nix, das macht der Stream selber im Destruktor.

Nutze SendStream() und setze danach Stream auf Nil. Der Socket gibt den Stream nach dem Senden selbstständig frei, da er ihn asynchron zu deinem VCL Code versendet.

LAWn-M0W3R 26. Sep 2006 20:11

Re: Problem: TMemoryStream und JPEG Netzwerküberwachungssoft
 
Danke, hat mir trotzdem nicht weitergeholfen, aber Capacity hat irgendwie die selbe Funktion! Ich glaube ich probier das mit den Indys jetzt nochmal!

Muetze1 26. Sep 2006 21:32

Re: Problem: TMemoryStream und JPEG Netzwerküberwachungssoft
 
Zitat:

Zitat von LAWn-M0W3R
Danke, hat mir trotzdem nicht weitergeholfen, aber Capacity hat irgendwie die selbe Funktion! Ich glaube ich probier das mit den Indys jetzt nochmal!

Nein, hat es nicht. Die Kapazität der Stringliste wird immer um eine Wert erhöht und gibt nicht die aktuelle Befüllung an. Dieses ist dazu gedacht, dass die Speicheralloziierung nicht bei jedem neuen Item tätig werden muss, was den Speicher fragmentiert.

Und das dies alle Fehler waren, wage ich eh zu bezweifeln. Es ist schwer einen solchen Quellcode alle Fehler zu finden durch reines schauen. Mich würde zum Abschluss noch interessieren, wie du den Punkt Nummer 2 gelöst hast. Könntest du den Codeabschnitt mit deinrer Korrektur nochmals posten, bitte?

LAWn-M0W3R 27. Sep 2006 14:28

Re: Problem: TMemoryStream und JPEG Netzwerküberwachungssoft
 
OK?! Naja, den Code hab ich nicht bei, da ich erst ewig woandershinlaufen muss um ans Internet zu kommen, weil es bei uns noch kein Internet gibt, aber ich habe noch ein wenig rumprobiert und das ganze dann auch theoretisch mit SendStream() hinbekommen! Das sieht dann, glaube ich, so aus:
Delphi-Quellcode:
var FStream: TFileStream //oder auch TMemoryStream
begin
//Screenshot wurde gemacht und unter 'C:\screenshot.jpg' abgespeichert
FStream := FStream.Create('C:\screenshot.jpg', fmOpenRead);
SendStream(FStream);
end;
Nun zum nächsten Problem: Ich versende ja alle möglichen Informationen per SendText und empfange sie auch wieder mit ReceiveText, aber der Stream ist irgendwie auch nur Text und nun habe ich ein einfaches Trennungsproblem! Ich empfange den Stream und speichere ihn da, wo Chatdaten oder Befehle ankommen! Wenn ich bestimmte Buchstabenfolgen vor das zu sendenden Datum setzte (z.B. '#NA' + Nachricht oder '#Screenshot' für den Screenshotbefehl), verwirft Delphi den empfangenen Text gleich nachdem ich ihn das erste mal abgefragt habe, wenn ich ihn nicht vollständig in eine Variable speichere!
Ich hab hier eine Lösungstheorie, weiß aber nicht, ob und wie sie funktioniert: Man müsste den Stream, der ja sowieso als Text ankommt von String wieder in einen TFile- oder TMemoryStream umwandeln und ihn dann dem bereits konstruierten Stream übergeben und ihn die einzelnen Teile zusammenfügen lassen.
Was sagt ihr dazu? Ist das möglich? Gibt es eine sauberere Lösung?

P.S.: Wenn ihr mir einen vollen Stream-Quelltext postet, dann bitte einen für TMemoryStream, weil ich eigentlich meine JPEG-Datei nicht auf der Festplatte zwischenspeichern möchte, da das viel zu langsam ist.

Muetze1 27. Sep 2006 15:04

Re: Problem: TMemoryStream und JPEG Netzwerküberwachungssoft
 
Tja, der Socket überträgt die Daten einfach, ihn interessiert der Inhalt und Aufbau nicht. Daher musst du zur sauberen Trennung dir ein Protokoll ausdenken. Du könntest zum Beispiel die Grösse der nachfolgenden binären Daten vorher übertragen, dann weiss der Client auch wie lange er es in den Memory Stream zu schreiben hat und wann er es interpretieren soll. Deine Lösung wäre in so fern problematisch, wenn die binäre Datei die gleichen Zeichen enthält wie deine Ende-Markierung vom Stream. Dies kann immer vorkommen - z.B. wenn du deinen Beitrag über dein Programm versendest. Daher bietet sich die Lösung, die Grösse zuvor zu übertragen, an, da sie die Interpretation der Daten verhindert und somit eine Fehlinterpretation der Daten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz