AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Client / Server Dateien senden und empfangen.
Thema durchsuchen
Ansicht
Themen-Optionen

Client / Server Dateien senden und empfangen.

Ein Thema von codenoob · begonnen am 25. Mär 2015 · letzter Beitrag vom 2. Apr 2015
Antwort Antwort
codenoob
(Gast)

n/a Beiträge
 
#1

Client / Server Dateien senden und empfangen.

  Alt 25. Mär 2015, 23:58
Hi,

Ich hab mal eine Frage.

Ich befasse mich seit kurzem mit den Socket Komponenten und dem senden und empfangen von Dateien.

Ich hab mich mit den TClientSocket / TServerSocket und den Indy TidTCPClient / TidTCPServer Komponenten bisschen befasst.
Die Dateien hab ich immer in ein TFileStream geladen und dann mit SendStram versendet.

Was mir dabei aufgefallen ist war das ich mit....

TClientSocket / TServerSocket nur Dateien mit max. 700MB und mit den Indy TidTCPClient / DidTCPServer bis max. 2GB Grösse versenden konnte.
Gibt es da bei den Komponenten ein Limit was die Grösse des Versendens angeht, oder hat das mit dem FileStream zu tun?


Ich habe da schon Codes gefunden der das ganze blockweise macht leider funktioniert das mit Delphi XE2 leider nicht ka. warum.

Delphi-Quellcode:
procedure SendFile(lpFileName: string; Socket1: TClientSocket);
var
  F: file;
  FileInfo: TFileInfo;
  dwFileSize, dwBytesRead: DWORD;
  Buffer: array[0..4096] of Char;
begin
  {$I-}
  AssignFile(F, lpFileName);
  Reset(F, 1);
  dwFileSize := FileSize(F);
  FileInfo.FileName := lpFileName;
  FileInfo.FileSize := dwFileSize;
  Socket1.SendBuffer(FileInfo, SizeOf(FileInfo));
  repeat
    FillChar(Buffer, SizeOf(Buffer), 0);
    BlockRead(F, Buffer, SizeOf(Buffer), dwBytesRead);
    Socket1.SendBuffer(Buffer, dwBytesRead);
  until (dwBytesRead = 0);
  CloseFile(F);
  {$I+}
end;

procedure ReceiveFile(Socket1: TClientSocket);
var
  F: file;
  lpFileName: string;
  FileInfo: TFileInfo;
  dwFileSize, dwBytesRead: DWORD;
  Buffer: array[0..4096] of Char;
begin
  Socket1.ReceiveBuffer(FileInfo, SizeOf(TFileInfo));
  lpFileName := FileInfo.FileName;
  dwFileSize := FileInfo.FileSize;
  {$I-}
  AssignFile(F, lpFileName);
  ReWrite(F, 1);
  repeat
    FillChar(Buffer, SizeOf(Buffer), 0);
    dwBytesRead := Socket1.ReceiveBuffer(Buffer, SizeOf(Buffer));
    BlockWrite(F, Buffer, dwBytesRead);
    Dec(dwFileSize, dwBytesRead);
  until (dwFileSize <= 0);
  CloseFile(F);
  {$I+}
end;
Kann mir da jemand bisschen unter die Arme greifen der sich damit auskennt und mir den richtigen Weg weisen? Bin absoluter Neuling....

Danke schon im Voraus und Lg. CodeNoob
  Mit Zitat antworten Zitat
codenoob
(Gast)

n/a Beiträge
 
#2

AW: Client / Server Dateien senden und empfangen.

  Alt 26. Mär 2015, 21:05
Kann mir da echt keiner helfen?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#3

AW: Client / Server Dateien senden und empfangen.

  Alt 26. Mär 2015, 22:33
Ich habe da schon Codes gefunden der das ganze blockweise macht leider funktioniert das mit Delphi XE2 leider nicht ka. warum.
Was heißt: funktioniert nicht?

Übrigens: ein DWORD kann auch keine Größe über ca. 4GB speichern. Besser für solche Werte Int64 nehmen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Client / Server Dateien senden und empfangen.

  Alt 27. Mär 2015, 07:47
Schau doch mal nach, wie FileSize(F) deklariert ist. Es liefert mW einen 'LongInt', was einem 'Integer' entspricht womit sich die 2GB Obergrenze erklären würden (bei D6).
  Mit Zitat antworten Zitat
codenoob
(Gast)

n/a Beiträge
 
#5

AW: Client / Server Dateien senden und empfangen.

  Alt 1. Apr 2015, 01:05
Hier Uwe ich habe Dir hier mal meinen Quellcode.

Anhang 42825

Der Client verbindet mit Server aber beim Senden der Datei bleibt der Server hängen und ich habe echt keine Ahnung was ich da falsch gemacht habe.

Liebe Grüsse Tom

Geändert von codenoob (15. Jan 2016 um 00:09 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Client / Server Dateien senden und empfangen.

  Alt 1. Apr 2015, 07:54
Wieso hängst Du den Quellcode nicht an deinen Beitrag?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
 
Delphi 12 Athens
 
#7

AW: Client / Server Dateien senden und empfangen.

  Alt 1. Apr 2015, 08:37
Ja, FileSize, Seek und Co. der "alten" Pascal-Funktionen sind nur 32 Bit, aber in der DP verstecken sich notfalls Addons für 64 Bit.
Ein sequentielles Read/Write ist davon aber nicht betroffen und im FreePascal wurde das Problem auch schon behoben.

Und dann gibt es natürlich noch die vielen neueren Stream-Varianten, und man kann sich schon fast fragen, warum sich einige Entwickler dagegen so wehren und warum sie auch noch die Fehlerbehandlung so dermaßen fahrlässig unterdrücken und fehlermeldungen vershrotten ({$I-} ohne Behandeln von IOResult) ... da soll sich dann auch keiner Wundern, wenn er nicht weiß, warum es nicht geht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Apr 2015 um 08:41 Uhr)
  Mit Zitat antworten Zitat
codenoob
(Gast)

n/a Beiträge
 
#8

AW: Client / Server Dateien senden und empfangen.

  Alt 2. Apr 2015, 01:12
Ich habe jetzt mal die ganzen {$I-} rausgenommen und der Client scheint die datei ohne Fehler zu verschicken.
Leider bekomme ich beim server jetzt ne E/A Fehler 1784 Fehlermeldung.
Was ist das für ne Fehlermeldung? Und was mache ich immer noch falsch?


Hier mein geändertet Quellcode und wie gesagt ich programmiere es in XE2
Anhang 42834


l.g Tom

Geändert von codenoob (15. Jan 2016 um 00:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
 
Delphi 12 Athens
 
#9

AW: Client / Server Dateien senden und empfangen.

  Alt 2. Apr 2015, 03:56
MSDN-Library durchsuchenGetLastError > https://msdn.microsoft.com/de-de/lib.../ms681386.aspx
Zitat:
ERROR_INVALID_USER_BUFFER
1784 (0x6F8)
The supplied user buffer is not valid for the requested operation.
Delphi-Quellcode:
// SendFile
 Reset(F, 1);
try
  ...
  while dwFileSize > 0 do begin
    //FillChar(Buffer, SizeOf(Buffer), 0); // wozu?
    i := Min(dwFileSize, SizeOf(Buffer));
    BlockRead(F, Buffer, i);
    if Socket.SendBuffer(Buffer, i) <> i then
      raise Exception.Create('eine Fehlermeldung');
    Dec(dwFileSize, i);
  end;
finally
  CloseFile(F);
end;

// ReceiveFile
ReWrite(F, 1);
try
  while dwFileSize > 0 do begin
    i := Min(dwFileSize, SizeOf(Buffer));
    if Socket.ReceiveBuffer(Buffer, i) <> i then
      raise Exception.Create('eine Fehlermeldung');
    BlockWrite(F, Buffer, i);
    Dec(dwFileSize, i);
  end;
finally
  CloseFile(F);
end;
Und du solltest dich unbedingt mal mit Fehlerbehandlungen beschäftigen, aber vorallem auch mit dem Resourcenschutz,
denn Resourcenschutzblöcke (Try-Finally) fehlen in deinem Code an jeder Ecke.
Aber wir lieben ja unsere Speicherlecks und offenen Dateihandles, die bis zum Programmende bestehen bleiben.


Da die Funktion SendFile auf Form1 zugreifen muß (also eine der bösesten globalen Variablen), sollte man sich schon gedanken machen, nach dem Warum.
* Entweder FileInfo als Result und der Aufrufer gibt das dann aus (der bessere und vorallem total unabhängige Weg)
* oder der Aufrufer übergibt zumindestens seine Referenz (Parameter TForm1 ins SendFile aufnemen und Self übergeben > nicht zu empfehlen, da dann immer von TForm1 abhängig ist)
* oder die Prozedur als Methode in TForm1 > private aufnehmen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Apr 2015 um 04:03 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:39 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