Autor Beitrag
Arnulf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 04.03.05 15:13 
Hallo
Ich verschicke daten über einen client socket.
Das funktioniert sehr gut nur möchte ich die bandbreite beschränken.
Das ist leider beim TClientSocket im Delphi nicht möglich (glaub ich).
Also will ich von der Datei oder von dem Memory stream nur jeweils 4 kb einlesen und pro sekunde verschicken. Das sollte die bandbreite reduzieren.

Wie mach ich das dann?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var AStream : TFileStream;
    Buffer  : Pointer;

begin
               try
                 AStream := TFileStream.Create('Datei.txt',fmOpenRead);
                 buffer := AllocMem(AStream.Size);
                 AStream.Read(Buffer^,AStream.Size);
                 fMain.ClientSocket.Socket.SendBuf(buffer^,AStream.Size);
               finally
                 FreeMem(buffer);
                 FreeAndNil(AStream);
               end;
end;

Ich kenn mich mit files und streams nicht besonders gut aus.
aber ich müsste das irgendwie über eine while schleife machen:
while AStream.Position < AStream.Size do
begin
hier jetzt in den buffer nur 4 k einlesen und die position merken.
hier verschicken
sleep (1000); // vielleicht muß ich auch nicht warten ... muß ich testen.
end;

und die position mit f.seek merken und dann weiter einlesen, bis hald das ende erreicht ist.

aber leider hab ich da nicht ganz den durchblick.

Hoffe mir kann da jemand helfen.
Arnulf

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.03.05 15:27 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
const 
    Package = 4*1024; //4kb
var AStream : TFileStream;
    Buffer  : Pointer;
    a: integer;

begin
               try
                 AStream := TFileStream.Create('Datei.txt',fmOpenRead);
                 buffer := AllocMem(Package);
                 for a := 1 to AStream.Size div Package do
                 begin
                   AStream.Read(Buffer^,Package);
                   fMain.ClientSocket.Socket.SendBuf(buffer^,Package);
                   sleep(1000); //nur in zusätzlichem Thread empfehlbar
                 end;
               finally
                 FreeMem(buffer);
                 AStream.Free;
               end;
end;

Soweit der von dir geschriebene Code stimmt, kannst du mit obigem Code Packges à 4 KB verschicken. Natürlich musst du noch berücksichtigen, dass ein kleiner Rest im Stream überbleiben könnte, den du nach Durchlauf der Schleife noch verschicken musst.
Hoffe, dass keine Fehler drin sind, ansonsten: korrigieren, korrigieren, korrigieren ;)
Arnulf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 04.03.05 17:44 
Danke das ging ja schnell :)
ja der source code stimmt ziemlich hab hald nicht alles reingeschrieben.
aber der teil oben stimmt und funktioniert.

ich bin mir aber nicht sicher ob das wirklich die bandbreite weniger belasten wird.
es könnte durchaus sein, daß er jetzt 4 kb durchs internet jagt und trotzdem die ganze bandbreite braucht. hald jede sekunde nur einmal.
das würde trotzdem lags verursachen wenn man nebenbei zum beispiel spielt oder ähnliches.

muß damit experementieren... :)
wenn jemand eine bessere idee hat wie man die bandbreite reduziert dann immer her damit.
danke jedenfalls.
Arnulf
schlumpf70
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 21



BeitragVerfasst: Fr 04.03.05 17:48 
ja würde mich auch interesieren,

aber es müsste doch möglich sein den fortschritt anzuzeigen und je nachdem dan ndie pakete schicken.

Flashfxp hast ja auch die möglichkeit dies zu machen und die geschwindigkeit zu begrenzen

:?
Arnulf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 04.03.05 18:12 
naja ich muß es sest noch austesten ob das jetzt wirklich etwas bring mit der bandbreite.
jedenfalls die ganze funktion der vollständigkeit halber schaut so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
for i := 1 to AStream.Size div Package do
begin
  AStream.Read(Buffer^,Package);
  fMain.ClientSocket.Socket.SendBuf(buffer^,Package);
  Sleep (500);
  count := i;
end;
if ((count*1024) < AStream.Size)
then begin
  last := AStream.Size - (count * 1024);
  AStream.Read(Buffer^,last);
  fMain.ClientSocket.Socket.SendBuf(buffer^,last);
end;

vielleicht gehts auch einfacher - aber so hab ichs hald gemacht.
danke nochmal

Und falls jemanden punkto bandbreite noch etwas einfällt - immer rein in den thread :)
Arnulf

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 04.03.05 18:44 
Mache einfach die Pakete kleiner. Selbst bei einer DSL-Leitung können am Stück geschickte 4 KB schon für Lags bei anderen Anwendungen sorgen. Wenn du aber 1kb-Pakete nimmst, verringert sich die Zeit der Leitungsblockade schon wesentlich. Lags sind in dem Sinne zwar immer noch vorhanden, fallen aber beträchtlich kürzer und damit weniger spürbar aus.
Arnulf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 04.03.05 23:41 
naja schon...
aber man kann heutzutage mit 12 kb/s upload rechnen ( die meißten haben schon mehr) im breitbandbereich.

jetzt könnte ich natürlich 1 kb packete verschicken aber dann würde doch die tcp verbindung nur die ports raufzählen und auf der anderen seite wieder zusammensetzen - aber trotzdem die volle leitung beanspruchen. oder etwa nicht?
das heißt ich brauch ein time delay zwischen den packeten.
also ein sleep(100) oder sleep (200) ; bei 1 kb packeten.
oder irre ich mich da?.
ausserdem hab ich das problem, daß tcp ja gerne packete zusammenfasst (nagler) also brauch ich auch ein timedelay damit nicht mehrere packete gleichzeitig weggeschickt werden.

Also getestet habe ich momentan 4kb stream mit sleep(500) - das geht recht gut und verursacht kaum probleme. Sicher Thread verwende ich nicht also hängt die anwendung aber das ist mir momentan egal :)

oder hab ich da was falsch verstanden ?

Arnulf