![]() |
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): ![]() 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? |
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 |
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. |
AW: UDP Datei senden und empfangen
Vielleicht lädst du falsch.. Wir können nicht hellsehen, daher musst du genug Information liefern!
=P |
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:
Wäre froh, wenn sich jemand das mal anschauen könnte.
//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; |
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:
|
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: ![]() |
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 |
AW: UDP Datei senden und empfangen
Es gibt übrigens schon ein Protokoll das Dateien per UDP überträgt:
![]() Du kannst dir mal den ![]() 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. |
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 |
AW: UDP Datei senden und empfangen
Wenn du etwas ernsthaftes, nicht-Echtzeit-kritisches mit größeren Datenmengen (Nachricht >> 1 Datagram) implementieren möchtest, solltest du nicht nur wegen des Hole-Punching auf TCP verzichten. Insbesondere, wenn das ganze über das Internet gehen soll. TCP würde jahrzehntelang auf die Übertragung von Byte-Strömen durch das Internet optimiert.
Wenn du es dir um den Lerneffekt geht: Viel Spaß dabei. ![]() |
AW: UDP Datei senden und empfangen
Zitat:
|
AW: UDP Datei senden und empfangen
Zitat:
Nämlich im Sinne von: Wenn man nicht etwas spezielles macht, sollte man bei TCP bleiben. Es wäre ein riesiger Aufwand, ein Protokoll zu entwerfen, welches nur annähernd so durchdacht ist wie TCP. Man macht das (afaik) in der Regel nur, wenn man 1. keine Zuverlässigkeit braucht und die Flusskontrolle + Stauvermeidung selbst übernehmen will (z.B. Echtzeit/Multimedia) oder 2. die zu übermittelnde Botschaft so kurz ist, das die Übertragung allein durch die Handshakes bedeutend verzögert wird (z.B. RPC). |
AW: UDP Datei senden und empfangen
Ach so hast du das gemeint:mrgreen:.
Theoretisch habe ich nichts dagegen, auf TCP umzusteigen. Aber ich kapiere irgendwie nicht, wie Hole Punching bei TCP funktioniert. Da das Protokoll nicht wie UDP verbindungslos ist merkt es ja sofort, ob die Anfrage fehlschlägt. Und dann haben wir ja kein "Loch" mehr in der Firewall. Oder versteh ich das jetzt falsch? Kann mir das bitte jemand genauer erklären? |
AW: UDP Datei senden und empfangen
Firewall? Wat? Weißt du überhaupt, was Holepunching ist?
|
AW: UDP Datei senden und empfangen
Ja ich weiss, ich habe mich unpräzise ausgedrückt und bin davon ausgegangen, das zur heutigen Zeit jeder Router auch eine interne Firewall hat...
PS: Ich fänds noch nett, wenn du mich nicht wegen jedem Scheiss fertigmachst. |
AW: UDP Datei senden und empfangen
Das Mapping der internen und externen Ports über die NAT (Network Addresss Translation) hat afaik absolut gar nichts mit einer Firewall zu tun!
Edit: Zu deinem PS... Tut mir Leid, aber nein. Wir sind hier in einem Forum, wo Wissen ausgetauscht wird. Leute die dieses Thread hier nachher bei ihren Problemen lesen werden, sollten keine falsche Informationen bekommen. Ich mache dich nicht fertig, ich korrigiere dich; jetzt bist du schlauer! Oder willst du nicht schlauer werden? Die Art, wie ich antworte soll lehren, dass du nächstes Mal genauer drüber nachdenkst, wenn du etwas schreibst! |
AW: UDP Datei senden und empfangen
Zitat:
Jede Vorgehensweise die noch einfacher sein will oder irgendwas weglassen will wird nicht funktionieren. Stell dir vor du willst einen neuen Zug erfinden. Dann wäre es doch viel viel einfacher das bestehende Schienensystem zu verwenden, oder? Du möchtest vielleicht ein neues Schienenprofil mit weniger Reibung erfinden. Dan wäre es sehr geschickt dafür existierende Züge zu verwenden. Regelrecht dumm wäre es Zug und Schienen neu zu erfinden wenn das Gesamtergebnis schlechter als das bisherige Standardsystem ist. So und jetzt übertrage diese Analogie auf Client und Server. Wenn du Client und Server gleichzeitig eintwickeln musst und ausserdem kaum eine Ahnung hast wie Netzwerkprotokolle funktionieren, tja dann wird es richtig schwierig. Wenn aber z.B. der Server und das Datenprotokoll schon feststehen, dann ist es viel einfacher einen Client zu programmieren. |
AW: UDP Datei senden und empfangen
Zitat:
Zitat:
Ein "Wat?" hilft denen genauso wenig wie es TTF hilft :mrgreen: |
AW: UDP Datei senden und empfangen
Doch natürlich möchte ich schlauer werden:-D, aber es funktioniert ja auch, wenn der Computer direkt am Netz hängt, also ohne Router. Wie gesagt, ich habe mich unpräzise ausgedrückt und hätte besser NAT schreiben sollen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 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