Dateien über TCP/UDP kopieren
Übersicht

IonPainterBetreff: Dateien über TCP/UDP kopieren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so nachdem mir im Chat nicht geholfen werden konnte nerve ich jetzt hier ![]() Problem: Ich möchte Dateien über TCP oder UDP verschicken. Diese Dateien sind z.b. MPG Files mit entsprechender größe (auch mal mehrere GB) Wie verschicke ich die Dateien am besten? Wenn ich sie Byteweise auslese dauert es bei 80KB ca 2 minuten zur übertragung, bei ReadLine kommen übertragungsfehler. Ausserdem hätte ich gerne eine Fortschrittsanzeige, wie kann ich sowas realisieren? IonPainter |
||
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
*schieb*
vllt erwarte ich zu viel? also für ne vernünftige Lösung würd ich auch zahlen... |
||
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte mal für einen Freund ein Programm gemacht das große Dateien gespalten hat. Dazu hab ich die Bytes einzeln aus der Quelldatei gelesen und in eine Bank geschrieben, was recht flott ging. Das könnte hier auch gehen. Die Bytes (mehrere MB in einem Schwung) in eine Bank einlesen, den ganzen Batzen in den TCP-Stream schreiben und senden. Durch TCP sollte dann das Paket in mehrere kleine aufgeteilt werden, was Dir dann ja aber auch egal sein kann ![]() Wenn meine Idee bescheuert sein sollte... schlagt mich einfach ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ION
Wie hast du es denn gemacht? Code? Wie groß sind die einzelnen Pakete? Hast du das über LAN, Internet oder nur Lokal getestet? Vielleicht finde ich heute abend etwas Zeit um das selbst auszuprobieren. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] while not eof(datei) x$ = "" for i = 1 to groesse X$ = x$ + chr$(readbyte(datei)) if eof(datei) then exit next writeline x$, Tcp wend und auf clientseite dann halt rückschreiben mit mid$() und asc() writebyte asc(mid$(x$,i,1)), datei code is net geprüft, jetz nur ausm kopf, so in etwa hab ich das gelöst, funzte auch nur war irre lahm egal wie hoch größe war habs ÜBER LAN getestet (100mbit) Paketgröße hab ich alles ausprobiert, von 1 Byte bis mehrere Kilobyte, bleibt lahm... [/code] |
||
furbolg |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
is ja auch klar, das 1 GB mit 1 byte monate lang dauert denn.
1024 byte = 1 kb 1024 kb = 1 mb 1024 mb = 1 gb Ich würde dir raten mindestens 1024 Byte zu senden, aber nicht jeden frame, das machen modems nich mit. sonder nur alle 150 ms. |
||
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wie gesagt, will die files übers lan verschicken, auch ein hochsetzen der größe auf 1024 bringt nicht wirklich was... | ||
MaGus |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab mal ein bisschen rumexperimentiert und hab mit folgendem Code die besten Ergebnisse bekommen. Wohl längst nicht das Optimum, aber mehrere MB pro Minute sind drin, WENN keine anderen prozessorlastigen Programme nebenher laufen. Als ich nebenher was gespielt hab ging die Übertragungsrate extrem runter. Außerdem hatte ich erst noch Prints für die Fortschrittsanzeige drin, aber auch die haben zu sehr runtergezogen. Der Code ist also sehr prozessorabhängig.
Sender: Code: [AUSKLAPPEN] While target=0
target=OpenTCPStream("169.254.22.65",12345) Wend filename$="bender.avi" file=ReadFile(filename$) size=FileSize(filename$) For x=0 To size If size-x>8192 Then For y=0 To 8192 WriteByte target,ReadByte(file) Next x=x+y Else WriteByte target,ReadByte(file) EndIf Next Empfänger: Code: [AUSKLAPPEN] Stream=CreateTCPServer (12345)
While connected=0 connected=AcceptTCPStream(stream) Wend file=WriteFile("bender.avi") While Not t>100000 z=ReadAvail(connected) If z=0 Then t=t+1 Else t=0 For x=0 To z-1 WriteByte file,ReadByte (connected) Next EndIf Wend CloseFile file |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stell dir vor du würdest die Datei von Festplatte laden - das würde auch Tage dauern - weil du einzelne Bytes liest - das ist ein Overkill
Schon mal WriteBytes, ReadBytes gesehen? Mehrere GB würde ich so senden: Erstelle Checksumme von jedem 1024-Byte-Päckchen (Größe evtl. optimieren, wenn es nicht so gut sein soll) und sende das auf einmal per TCP/IP (also nur checksummen) Dann machst du UDP-Stream auf und sendest deine 1024 Byte Päckchen los - wenn Checksumme nicht richtig ankommt, dann merkst du dir das Päckchen... Wenn alles komplett da ist, dann sendest du zu deinem Quell-PC die Päckchen-Nummern, die nicht angekommen sind... und wieder von neu... Allerdings musst du exakt wissen wann Päckchen beginnt und endet (k.A. wie man das am besten macht) Aber versuch erstmal nur TCP/IP |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
also ich mache das jetzt komplett über TCP da es mehr auf fehlerfreiheit ankommt. | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group