AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke UDP Datei senden und empfangen
Thema durchsuchen
Ansicht
Themen-Optionen

UDP Datei senden und empfangen

Ein Thema von TTF · begonnen am 27. Okt 2013 · letzter Beitrag vom 29. Okt 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#1

UDP Datei senden und empfangen

  Alt 27. Okt 2013, 11:43
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...
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?
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 15:49
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#3

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 18:54
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.
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 19:12
Vielleicht lädst du falsch.. Wir können nicht hellsehen, daher musst du genug Information liefern!
=P
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#5

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 19:41
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.
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#6

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 20:08
Es hat nun geklappt. Ich hatte noch unnötige Überreste von meiner eigenen Datei drin, wodurch das bmp ungültig wurde
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 20:11
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
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#8

AW: UDP Datei senden und empfangen

  Alt 27. Okt 2013, 20:39
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
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: UDP Datei senden und empfangen

  Alt 28. Okt 2013, 08:23
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von TTF
TTF

Registriert seit: 19. Mai 2013
70 Beiträge
 
Delphi XE4 Enterprise
 
#10

AW: UDP Datei senden und empfangen

  Alt 28. Okt 2013, 16:34
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
Angehängte Grafiken
Dateityp: jpg Original.jpg (7,0 KB, 42x aufgerufen)
Dateityp: jpg Empfangenes.jpg (9,7 KB, 37x aufgerufen)
Quidquid id est, timeo perfossores machinae computatoriae et dona ferentes...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:58 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