Datei schnell schicken.
Übersicht

![]() |
maboxBetreff: Datei schnell schicken. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo, ich hatte vor ein Paar Tagen schonmal ein Thread mit ähnlichen Thema in welchem mir leider nicht alle Fragen beantwortet wurden. Ich hoffe ihr nehmts mir nicht übel wenn ich jetzt nochmal frag.
1. Ich will eine Datei über TCP von einem PC zum anderen schicken. Zuerst hatte ich die einzelnen bytes der Datei rübergeschickt. Das hat ganz gut funktioniert und man konnte auch schauen wieviel % schon da sind. Leider war das ganze VIEL zu langsam. Jetzt will ich die Datei als ganzes, oder in größeren Stücken mit "ReadBytes" und "WriteByites" verschicken. leider funktioniert da etwas nicht in meinem Code: Server Code: [AUSKLAPPEN] ;Server
Graphics 640,480,16,2 AppTitle "Server" .datei_laden datei_zum_senden$=Input("Datei: ") Datei1=OpenFile(datei_zum_senden$) If Datei1 = 0 Then Print "Datei fehlt":Goto datei_laden Dateigroesse1=FileSize(datei_zum_senden$) Print "Dateigröße: "+datei_zum_senden$+" "+Dateigroesse1 Speicherfeld1 = CreateBank(Dateigroesse1) server=CreateTCPServer(21) a=1 Repeat senden=AcceptTCPStream(server) If senden Then If a=1 Then WriteLine(senden, datei_zum_senden$) WriteLine(senden, Dateigroesse1) a=0 EndIf While Not Eof (Datei1) Byte=ReadBytes (Speicherfeld1, Datei1, b, b+10) Byte=WriteBytes (Speicherfeld1, senden, b, b+10) b = b + 10 Wend EndIf Forever Print "Datei erfolgreich gesendet" WaitKey() Client: Code: [AUSKLAPPEN] ;Client
Graphics 640,480,16,2 AppTitle "Client" ip$ = "169.254.178.66" ;ip$ = Input ("IP eingeben: ") tcp = OpenTCPStream(ip$, 21) If tcp<>0 Then Print "Verbindung erfolgreich hergestellt." Else Print "Verbindung konnte nicht hergestellt werden." WaitKey() End End If Datei_zum_bekommen$=ReadLine(tcp) Datei2=WriteFile(Datei_zum_bekommen$) Dateigroesse2#=ReadLine(tcp) Speicherfeld2 = CreateBank(Dateigroesse2#) Print Datei_zum_bekommen$+" runterladen von "+ip$ Print "Größe: " + Dateigroesse2#+ " Bytes" Repeat Byte=ReadBytes (Speicherfeld2, tcp, b1, b1 + 10) a#=a#+10 prozent#=a#/Dateigroesse2# prozent#=prozent#*100 AppTitle prozent#+"%" Byte=WriteBytes (Speicherfeld2, Datei2, b1, b1 + 10) b1 = b1 + 10 Until a# >= Dateigroesse2# Print "Datei angekommen" WaitKey() Wenn ich beides starte kommt beim Client während dem empfangen die Fehlermeldung: "Offset out of range". Was ist da falsch? Ausserdem gahts nur wenn ich den Client zuerst starte, das wundert mich auch ein bisschen. 2. Jetzt ist es immernoch sehr langsam weil es nur 10 Bytes pro schleifendurchlauf sendet. Wie kann ich die ganze Datei auf einmal schicken und trotzdem sehen wieviel von ihr schon angekommen ist? |
||
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl Dönerfresser Homepage |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
garnicht, wenn du sehen willst was passiert musst du immer ma wieder anzeigen was passiert
und dein hauptproblem ist das du 10 bytes schreibst, aber nie checkst ob es überhaupt noch 10 zum lesen gab |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank, darauf war ich noch garnicht gekommen. Wie könnte ich das lösen? | ||
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl Dönerfresser Homepage |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
naja was glaubst du was in "byte" steht? siehe doku ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie meinst du das? (ein Byte sind acht Bit, 256 Anordnungsmöglichkeiten von 1 und 0)
Kann man nicht irgendwie die Datei als Ganzes schicken und die Größe von dem Teil der Datei welcher schon da ist mit der Gesamtgröße vergleichen? Zitat: garnicht, wenn du sehen willst was passiert musst du immer ma wieder anzeigen was passiert und nochmal dazu, Es wird doch oben in der Fensterleiste angezeigt was passiert.
|
||
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl Dönerfresser Homepage |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Newin, du kannst nicht einfach die ganze datei schicken. Zerleg sie in blöcke, und mach die von der Gesamtgröße der Datei abhängig. Wenn du zB eine 1000 KB große Datei senden willst wähle als Sendeblock 10KB - dann hast Du ein Prozent pro Sendevorgang. Bei kleineren Dateien kannst Du gröber werden, es macht zB kaum sinn eine 100 Byte Datei in 100 einzelne Bytes zu zerteilen.
Dein Code kann nebenbei nicht funktionieren, da Du sowohl im Client als auch im Server die bytes einlesen und schreiben lässt - hier empfehle ich noch mal die ausführliche Lektüre von ql:writebytes und ql:readbytes inklusive der Beschreibung für die Parameter. Dreamora meinte btw. den Rückgabeparameter 'Byte' den Du ja auch schön in Deinen Code übernommen hast, ohne ihn aber zu verstehen wie es scheint. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
mabox |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, das stimmt, ich habe ReadBytes und WriteBytes nicht ganz verstanden und bis jetzt versteh ich es immernoch nicht ganz, werde es mir aber heute Nachmittag nochmal anschauen.
Ich dachte ich muss die Bytes aus der Datei auslesen und in ein Speicherfeld speichern. Von dort aus werden sie wieder ausgelesen und verschickt. im Client werden die ausgelesenen Bytes dann wieder in einem Speicherfeld gelagert und dann in eine Datei gespeichert. Das stimmt nicht ganz oder? ~Edit:hab mir das mit ReadBytes und WriteBytes nochmal angeschaut und habe es entweder nicht verstanden oder mein Code ist doch richtig, irgendwie ist das komisch. Könnt ihr mir sagen was ich genau falsch mache? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group