Datei schnell schicken.

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: Datei schnell schicken.

BeitragDo, Feb 21, 2008 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 21, 2008 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
naja was glaubst du was in "byte" steht? siehe doku Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mabox

BeitragDo, Feb 21, 2008 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BladeRunner

Moderator

BeitragFr, Feb 22, 2008 7:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Feb 22, 2008 8:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group