Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   UDP Datei senden und empfangen (https://www.delphipraxis.net/177240-udp-datei-senden-und-empfangen.html)

TTF 27. Okt 2013 10:43

UDP Datei senden und empfangen
 
Hallo liebe Delphianer,

Als erstes wollte ich mich bedanken bei diesem genialen Forum, in dem die Leute so schnell und gut antworten wie fast nirgends sonst.

Mein Problem:
Ich möchte gerne Dateien über UDP versenden. Für den Anfang erst einaml mit den Komponenten von Indy(oder andere, falls sie sich besser eignen).
Das Problem ist, dass ich auf keinen Fall auf TCP ausweichen kann, wie überall vorgeschlagen, denn ich möchte die Technik des Hole Punchings verwenden, welches sich an eine Ungenauigkeit von UDP anlehnt. Also kann man eigentlich sagen, mein "Vorbild" ist Skype(kann auch Dateien senden und benutzt UDP): http://www.heise.de/security/artikel...en-270856.html

Meine bisherigen Versuche sind alle schon gescheitert, bevor das Programm fertig compiliert war...:roll:
Meistens mit dieser Meldung:
[dcc32 Fehler] Unit1.pas(55): E2250 Es gibt keine überladene Version von 'SendBuffer', die man mit diesen Argumenten aufrufen kann

Hat jemand eine Idee, wie man das lösen kann?

Aphton 27. Okt 2013 14:49

AW: UDP Datei senden und empfangen
 
Ich schlage vor, dass du lernst, wie man mit den Komponenten erst überhaupt umgeht. Kompliziertere Sachen sollten erst später kommen, da du sonst dir die Zähne daran ausbeißt und gar keine Freude mehr am Ganzen findest.

Und der Fehler den du da beschreibst, sollte man wenn man das ABC von Delphi kann, schnell beheben können.

Schau dir mal paar Grundlagentutorials an. Vorallem Funktionen/Prozeduren/Methoden + Rümpfe/Parameter

TTF 27. Okt 2013 17:54

AW: UDP Datei senden und empfangen
 
Naja, wie dem auch sei...
Mit einer eigenen Minidatei habe ich es nun hingekriegt. Das komische ist aber wenn ich es mit einer *.txt Datei versuche, die nicht allzu viel grösser ist und erhalte die Exception
"Zu wenig Arbeitsspeicher". Ich kann mir beim besten Willen nicht vorstellen, dass das stimmen kann. Weiss jemand woran das liegen könnte?
Die Meldung kommt auch ohne abschicken, nur beim Laden in ein Byte-Array.

Aphton 27. Okt 2013 18:12

AW: UDP Datei senden und empfangen
 
Vielleicht lädst du falsch.. Wir können nicht hellsehen, daher musst du genug Information liefern!
=P

TTF 27. Okt 2013 18:41

AW: UDP Datei senden und empfangen
 
Ich habe den Fehler gefunden und es funktioniert auch soweit(Habe die Länge der Datei falsch zugewiesen). Aber wenn ich die Datei nach dem Senden wieder abspeichere steht in der geladenen *.txt nebst dem ursprünglichen Text noch etwas anderes nämlich ein komisches Zeichen. Sieht ungefähr so aus: _|. Und wenn ich es mit einem *.bmp versuche geht es gar nicht(das erzeugt Bild lässt sich nicht richtig öffnen).
Anscheinend habe ich wohl noch den einen oder anderen Fehler drin:
Delphi-Quellcode:
//Senden
var
  Stream : TStream;
  i : Integer;
  Len : Longint;
  Datei : TIdBytes;
begin
  Stream := TFileStream.Create('D:\Testbild.bmp', fmOpenRead);

  Len := Stream.Size;

  SetLength(Datei,Len);

  for i := 0 to Len -1 do
  begin
    Stream.Read(Datei[i], SizeOf(Datei[i]));
  end;

  Stream.Free;

  IdUDPClient1.SendBuffer(Datei);
end;

//Empfangen:

var
  Stream : TStream;
  Len, i : Integer;
begin
  Stream := TFileStream.Create('D:\testbild1.bmp', fmCreate);

  Len := Length(AData);
  Stream.Write(Len, SizeOf(Len));

  for i := 0 to Length(AData)-1 do
  begin
    Stream.Write(AData[i], SizeOf(AData[i]))
  end;

  Stream.Free;
end;
Wäre froh, wenn sich jemand das mal anschauen könnte.

TTF 27. Okt 2013 19:08

AW: UDP Datei senden und empfangen
 
Es hat nun geklappt. Ich hatte noch unnötige Überreste von meiner eigenen Datei drin, wodurch das bmp ungültig wurde:wall:

jaenicke 27. Okt 2013 19:11

AW: UDP Datei senden und empfangen
 
Via UDP kannst du allerdings nie wissen, ob du auch alle Teile der Datei bekommst und ob sie in der richtigen Reihenfolge sind. Wenn du also unbedingt UDP nutzen willst, musst du die Pakete markieren und beim Empfang entsprechend wieder zusammensetzen. Sich darauf zu verlassen, dass es schon klappen wird, könnte lustige / traurige Ergebnisse bringen.

Für Hole Punching ist UDP allerdings nicht erforderlich, Skype verschickt Dateien auch per TCP, alles andere wäre auch wenig sinnvoll. Mehr zu TCP Hole Punching:
http://en.wikipedia.org/wiki/TCP_hole_punching

TTF 27. Okt 2013 19:39

AW: UDP Datei senden und empfangen
 
Danke für die Antwort. Ich wollte es einfach über UDP machen, weil ich irgendwo gelesen habe, dass es TCP Hole Punching extrem schwierig sei und man dazu mit raw sockets arbeiten muss, was nur mit C so richtig möglich sei...
Momentan schaue ich mal, ob ich das mit der Nummerierung und Aneinanderreihung der Pakete hinkriege. Andernfalls bin ich froh, wenn ich mich wieder hierhin wenden darf

sx2008 28. Okt 2013 07:23

AW: UDP Datei senden und empfangen
 
Es gibt übrigens schon ein Protokoll das Dateien per UDP überträgt:
Trivial File Transfer Protokoll (TFTP)
Du kannst dir mal den RFC 1350 einpfeifen.

Wenn du genau dieses Protokoll verwendest dann brauchst du Client und Server nicht gleichzeitig entwickeln, sondern kannst einen Teil zunächst mit unabhängiger und funktionierender Software ersetzen.

TTF 28. Okt 2013 15:34

AW: UDP Datei senden und empfangen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hmm danke, tönt interessant. Aber ich habe bei Wikipedia gelesen, dass es Standardmässig deaktiviert sei, da einige Würmer es zur Verbreitung benutzen...

Ich glaube ich bleibe mal vorerst bei UDP, da ich erstens schon ein paar Erfolge (wenn auch ziemlich lustige) erzielt habe und es sich besser erweitern lässt.

Wenns jemand interessiert, als Anhang ein Beispiel von einem eher etwas abstraktem Bild:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Seite 1 von 2  1 2      

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