Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Stream Fehler (https://www.delphipraxis.net/23699-stream-fehler.html)

BenjaminHelbig 8. Jun 2004 12:20


Stream Fehler
 
Hi DP'ler,

ich habe folgendes Problem. Ich sende über die UDP Komponente einen Stream an die Clientrechner bei uns im Netz. Wenn jetzt einer dieser Clients offline ist, dann bringt mir meine Hauptapplikation den Fehler:

StreamWrite Error und schmiert ab.

Folgender Code sendet den Befehl an die Clients:

Delphi-Quellcode:
try
 begin
   NMUDP1.ReportLevel := Status_BASIC;
   NMUDP1.RemoteHost := myhost;
   NMUDP1.RemotePort := RemotePort.Value;
   Mystream := TMemoryStream.Create;
   try
     MyStream.Write(mycommand[1], length(mycommand));
     NMUDP1.SendStream(MyStream);
   finally MyStream.free;
   end;
  end;
except ShowMessage('Fehler beim Senden');
end;
Der Käse ist, das der ober try except Block anscheinend vollkommen ignoriert wird, denn wenn der Client aus ist schmiert die Software ab, anstatt die Message anzuzeigen. Ist der Client hingegen online funzt alles einwandfrei.

Habt ihr eine Idee?

Luckie 8. Jun 2004 12:23

Re: Stream Fehler
 
Hast du in der IDE beim Testen auch die Debugger Exceptions deaktiviert?

Sharky 8. Jun 2004 12:53

Re: Stream Fehler
 
Zitat:

Zitat von BenjaminHelbig
... Ich sende über die UDP Komponente einen Stream an die Clientrechner bei uns im Netz.....

Hai Benjamin,

unabhängig von deiner Frage ist es nicht zu empfehlen Daten über UDP zu senden. Wenn dabei ein Packet verloren geht bekommt das der sendende Rechner nicht mit.

Muetze1 8. Jun 2004 13:54

Re: Stream Fehler
 
Moin!

Ich kenne die Komponente nicht, aber ich glaube zu wissen, wo dranne es liegt: am nicht ordentlich gelesener Hilfe...

Du übergibst der Komponente eine TStream Instanz, nun ist die Komponente bestimmt mit einem Thread aufgebaut, der im Hintergrund den Inhalt des Streams sendet. Somit wird das SendStream() sofort wieder verlassen und danach im Hintergrund gesendet. Wenn er nun so fleissig am Senden ist, kommst du und gibst den MemoryStream frei, was aber irgendwie ziemlich hinterhältig ist, da der Thread daraus noch Daten zum versenden lesen wollte...

Also: Grundsätzlich ist es bei den Sockets (egal welche Komponente, ob NetMaster oder Indy) so, dass sie die Daten in einem Thread senden und wenn du denen einen Stream übergibst kann der mehrere MB gross sein und das dauert, daher dürfen die Streams nicht freigegeben werden - das macht die Komponente, wenn sie fertig ist.

:? - ich hoffe ihr/du fasst es nicht falsch auf - nur mal so als Erklärung...

MfG
Muetze1

BenjaminHelbig 9. Jun 2004 06:35

Re: Stream Fehler
 
@Muetze1: Danke für den Tip, werd ich checken ob die Kompo den Stream freigibt.

@Sharki: Hast du einen Vorschlag wie man es besser macht? Warscheinlich über eine der Indy Komponenten, aber welche?

Grüßle

Sharky 9. Jun 2004 06:57

Re: Stream Fehler
 
Zitat:

Zitat von BenjaminHelbig
....@Sharki: Hast du einen Vorschlag wie man es besser macht? Warscheinlich über eine der Indy Komponenten, aber welche?...

Sharki :?: :stupid:

Entscheidend ist eingentlich das Du anstelle von UDP, TCP verwendest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.

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