Dateien über TCP/UDP kopieren

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

IonPainter

Betreff: Dateien über TCP/UDP kopieren

BeitragDi, März 16, 2004 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
so nachdem mir im Chat nicht geholfen werden konnte nerve ich jetzt hier Razz

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

BeitragDi, März 16, 2004 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
*schieb*

vllt erwarte ich zu viel?
also für ne vernünftige Lösung würd ich auch zahlen...

Hubsi

BeitragMi, März 17, 2004 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Wenn meine Idee bescheuert sein sollte... schlagt mich einfach Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

BIG BUG

BeitragMi, März 17, 2004 12:39
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, März 17, 2004 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 17, 2004 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 17, 2004 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
wie gesagt, will die files übers lan verschicken, auch ein hochsetzen der größe auf 1024 bringt nicht wirklich was...
 

MaGus

BeitragMi, März 17, 2004 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

TheShadow

Moderator

BeitragMi, März 17, 2004 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 17, 2004 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich mache das jetzt komplett über TCP da es mehr auf fehlerfreiheit ankommt.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group