Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datenübertragung Sendbuf.... (https://www.delphipraxis.net/125230-datenuebertragung-sendbuf.html)

suncezz 2. Dez 2008 22:50


Datenübertragung Sendbuf....
 
Hi, habe folgendes problem.. ich möchte eine datei von meinem client zum server übertragen..
Die ganze sache functioniert auch wunderbar, jedoch ist diese datei, welche beim server ankommt unbrauchbar... also ich habe mir eine mp3 geschickt, die danach allerdings nicht mehr zu lesen war vom player.. ich schicke mal den code dazu.. ich hoffe mir kann jemand helfen was ich falsch mache..
danek suncezz !!

Clienet : ///////////////////////

Code:
procedure TForm1.Button4Click(Sender: TObject);
var datei1: tfilestream;
    buff : array[1..1024] of byte;
    groese : integer;
begin
groese := 0;
if opendialog1.Execute then
begin
datei1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
repeat
datei1.Read(buff,sizeof(buff));
clientsocket1.Socket.SendBuf(buff,sizeof(buff));
groese := groese + sizeof(buff);
until groese > datei1.Size;
datei1.Free;
end;
end;
Server //////////////////////

Code:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);

var datei : tfilestream;
    fname : string;
    buff : array[1..1024] of byte;
    groese : integer;

begin
fname := 'C:\Dokumente und Einstellungen\Administrator\Desktop\ManuelsTestOrdner\sendet.mp3';

datei := TFileStream.Create(fname, fmCreate or fmShareExclusive);
groese := datei.Size;
repeat
serversocket1.Socket.Connections[0].ReceiveBuf(buff,sizeof(buff));
datei.Write(buff,sizeof(buff));
until datei.Size > 500000;  // wird noch behoben, bin mir aber sicher das es daran nicht liegt..
datei.Free;

end;
Ich habe die VErmutung das er mit den ersten bytes irgendwas falsch macht .. vlt kann mir ja jemand helfen.. danker schonmal im voraus,
mfg suncezz

sofl 30. Dez 2008 22:46

Re: Datenübertragung Sendbuf....
 
Mmh ich habe mal etwas ähnliches geschrieben und die Typen folgendermaßen gewählt...

Buffer: array [0..9999] of Char;
fSize: Int64;

ob das dir groß weiter hilft kann ich nicht versprechen :)

sx2008 31. Dez 2008 03:36

Re: Datenübertragung Sendbuf....
 
Deine Schleife zum Senden der Daten missachtet die Tatsache, dass die Datei ja nicht unbedingt ein Vielfaches von 1024 Bytes sein muss.
Deine Funktion würde also immer aufrunden und damit am Ende der Datei Müll übertragen.

Hier die Korrektur, die ich aber nicht getestet, sondern nur so eingetippt habe:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var datei1: TStream;
    buff : array[0..1023] of byte; // arrays, die mit Untergrenze 0 beginnen sind effizienter
    bytes : integer;
begin
  if opendialog1.Execute then
  begin
    datei1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
    repeat
      bytes := datei1.Read(buff[0],sizeof(buff)); // das Ergebnis von .Read() muss immer ausgewertet werden
      if bytes > 0 then
         clientsocket1.Socket.SendBuf(buff[0], bytes);
      until bytes = 0;
    datei1.Free;
  end;
end;

alzaimar 31. Dez 2008 08:03

Re: Datenübertragung Sendbuf....
 
Geht das nicht einfacher mit 'SendStream'?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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