AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Indy 10 / streams via tcp ip senden
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 / streams via tcp ip senden

Ein Thema von bernhard_LA · begonnen am 12. Nov 2011 · letzter Beitrag vom 18. Apr 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#11

AW: Indy 10 / streams via tcp ip senden

  Alt 24. Nov 2011, 09:48
Änder mal das hier, auf folgendes um:
Delphi-Quellcode:
  AClient.IOHandler.Write(AStream, StreamSize);
->
  AClient.IOHandler.Write(AStream.Memory^, StreamSize);
Und definiere AStream im Rumpf als TMemoryStream (sonst hast du keine "Memory" Property, auf die du schön zugreifen kannst)

Noch ne kleine, jedoch sehr wichtige Bemerkung:
Schickst du 10 kb ab, heißt es nicht dringend, dass 10 kb auch ankommen.
Kann sein, dass zuerst 2 kb ankommen, dann 5 kb, dann 1 kb und letzendlich 2 kb.

DU musst dir ne Struktur überlegen, die damit klar kommt.

Am besten nen globalen Stream anlegen, der alle ankommenden Daten puffert. Und aus dem Puffer extrahiert er ganze Datensätze.

Senden: 5 kb (Bild), 10 kb (Audio), ... (15 kb)
Puffer ->
Empfängt: 2kb, 5kb, nix, 3kb, 4kb, 1kb, ... (15 kb)

Jedesmal nach dem empfangen guggst du nach, ob ein ganzer Datensatz (Bild = 5kb, Audio = 10kb) da ist.
Dh nach dem ersten Empfangen hast du 2 kb, du liest die ersten 4 Bytes aus (Size) und guggst, ob die Größe des Puffers - 4 Bytes diesem Wert entspricht (oder größer ist), falls nicht, ist noch kein ganzer Datensatz da.
Falls ja, dann extrahierst du diesen Datensatz und arbeitest halt damit weiter. Puffern vergisst du im Hintergrund auch nicht. Muss schön weiterlaufen.
Wichtig ist noch, dass du die Daten, die du extrahiert hast, aus dem Puffer löschen solltest, da sonst dieser riesengroß wird und deine Anwendung crasht.

EDIT:
In Windows ist es ja so, dass man nur eine bestimmte Größe von Daten abschicken kann. Der maximale Wert (der zuerst gesetzt werden muss) ist 64 kb. Standardmäßig sinds (glaube ich) nur 8 kb (8192 b).
Deshalb würde ich WIEDER nen Puffer empfehlen, in die du die Daten, die du abschicken willst, reinpufferst. Vorallem auch weil man nicht wirklich immer Daten in dieser Größe abschicken kann, weil Windows intern auch noch puffert und die Daten erst später abschickt -> ist dieser Puffer voll, wird Send() nicht funktionieren.

Daten: 10 mb
Sendegröße: 8kb
Senden: 8 kb, 4 kb, 7 kb, 8 kb, 8 kb
Jedesmal nach dem Senden muss der Positionszeiger im Sendepuffer richtig gesetzt werden -> Position = Position + BytesSent

So habe ich das einmal realisiert und das ganze in ne Komponente gepackt.

Edit:
Ich weiß nicht, ob das Indy intern macht; ich habe nur mit den Standard TServerSocket / TClientSocket Komponenten gearbeitet (die imho nicht der Indy Komponentensammlung angehören)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (24. Nov 2011 um 10:46 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Indy 10 / streams via tcp ip senden

  Alt 24. Nov 2011, 10:25
in den beiden links (sieh weiter oben( steht nach meinerm Verständnis mit den params von READSTREAM und WRITESTREAM man diese Themaik in den Griff bekommen
obige Lösung sieht sehr komplex aus, einfache Lösung möglich ??
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Indy 10 / streams via tcp ip senden

  Alt 18. Apr 2012, 10:26
komplette Lösung jetzt online unter http://indy10clieservr.svn.sourcefor...am%20Exchange/
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz