% von empfangener Datei[gelöst] + Writebytes [nicht gelöst]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: % von empfangener Datei[gelöst] + Writebytes [nicht gelöst]

BeitragMo, Feb 18, 2008 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich sende mit einem Programm eine Datei an einen anderen PC, auf dem anderen PC soll angezeigt werden wieviel von der Datei schon angekommen ist. Das funktioniert leider nicht, hier ist dieser Teil aus dem Code.

Code: [AUSKLAPPEN]
Repeat
   Byte=ReadByte(tcp)
   a#=a#+1
   prozent#=a#/Dateigroesse2#
   prozent#=prozent#*100
   AppTitle prozent#+"%"
   WriteByte(Datei, Byte)
Until a# = Dateigroesse2#

Komischerweise wird oben in der Fensterleiste wo die Prozent Zahl angezeigt werden soll: "Infinity%"angezeigt.
Woran liegt das?
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
  • Zuletzt bearbeitet von mabox am Di, Feb 19, 2008 19:12, insgesamt 2-mal bearbeitet

The_Nici

BeitragMo, Feb 18, 2008 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd ja eh mal ReadLine durch Readbyte ersetzen, weil du ja auch Writebyte machst, und ReadLine gibt ein String aus.
Desweiteren verstehe ich nicht, dass prozent, a und Dateigroesse2 ein Float ist. Ich denk ma Integer tuns auch?

mabox

BeitragMo, Feb 18, 2008 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das mit den Byte statt Line war mein Fehler. Hab ich nicht aufgepasst, komischerweise gings trotzdem Very Happy
Das mit den Floats war schon so, das ist nämlich ein Beispielcode aus dem englischen Blitzforum, aber das ist ja eigentlich egal ob es Float oder Integer Werte sind oder?

Edit: Mir fällt gerade noch ein, wenns kein Float ist, könnte es dann nicht sein das ein Paar Bits am ender der Datei fehlen? oder ist das ein Denkfehler?

mahe

BeitragMo, Feb 18, 2008 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
"a" und "Dateigröße" sollten unbedingt Integer sein sonst kann es sein, dass der Vergleich der Schleife nicht klappt. Da Du die Bytes zählst kann da nix fehlen (es kommen eh nur ganze Bytes an).
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

mabox

BeitragMo, Feb 18, 2008 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
ok thx, ich kanns momentan nicht ausprobieren weil ich grad den anderen Rechner nicht hab, aber es wird schon klappen.
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

mabox

BeitragMo, Feb 18, 2008 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wegen Doppelpost, Aber ich habs jetzt ausprobiert und hab noch nen anderen Fehler gefunden an dem es lag, die Floats hatten damit garnichts zu tun. Jetzt funktioniert das Senden von Dateien ganz gut aber leider extrem langsam. Ich schicke eine 1,27MB Datei in 90 Minuten!!!
könnt ihr mir noch einen Tipp geben was ich falsch mache?
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

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=ReadByte(Datei1)
         WriteByte(senden, byte)
      Wend
   EndIf
Forever

Print "Datei erfolgreich gesendet"
WaitKey()

Client: Code: [AUSKLAPPEN]
;Client
Graphics 640,480,16,2
AppTitle "Client"

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)
Datei=WriteFile(Datei_zum_bekommen$)
Dateigroesse2#=ReadLine(tcp)

Print Datei_zum_bekommen$+" runterladen von "+ip$
Print "Größe: " + Dateigroesse2#+ " Bytes"

Repeat
   Byte=ReadByte(tcp)
   a#=a#+1
   prozent#=a#/Dateigroesse2#
   prozent#=prozent#*100
   AppTitle prozent#+"%"
   WriteByte(Datei, Byte)
Until a# >= Dateigroesse2#
Print "Datei angekommen"
WaitKey()
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

D2006

Administrator

BeitragMo, Feb 18, 2008 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann schick nich jedes Byte einzeln.

Schau dir mal ql:ReadBytes und ql:WriteBytes an.

Achja, noch zum ursprünglichen Problem, auch wenn's nun gelöst ist: Das lag offensichtlich daran, dass "dateigroesse2" 0 war. Denn bei Float kommt gerne mal "Infinity", wenn man durch 0 teilt (auch wenn's falsch ist, NaN wäre wohl korrekter)
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

mabox

BeitragMo, Feb 18, 2008 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke!

Richtig das das Ursprüngliche Problem war das "dateigroesse2" 0 war. Tut mir leid, dass ich extra gefragt hab.

Code: [AUSKLAPPEN]
Byte=READBYTES (Bank, Stream, Start, Anzahl)
Bei Anzahl muss ich die Dateigröße welche mit FileSize ermittelt wurde angeben oder?

Noch ein Problem: Wenn ich es jetzt starte kommt die Meldung: "Offset out of range". Irgendwas mach ich mit den Befehlen ReadBytes und WriteBytes falsch. Ich weis aber nicht was.

Hier mein aktueller 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()

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, 0, Dateigroesse1)
         Byte=WriteBytes (Speicherfeld1, senden, 0, Dateigroesse1)
      Wend
   EndIf
Forever

Print "Datei erfolgreich gesendet"
WaitKey()

Hier mein aktueller Client: Code: [AUSKLAPPEN]
;Client
Graphics 640,480,16,2
AppTitle "Client"

;ip$ = Input ("IP eingeben: ")
tcp = OpenTCPStream("169.254.178.66", 21)
Speicherfeld2 = CreateBank()

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)

Print Datei_zum_bekommen$+" runterladen von "+ip$
Print "Größe: " + Dateigroesse2#+ " Bytes"

Repeat
   Byte=ReadBytes (Speicherfeld2, tcp, 0, Dateigroesse2)
   a#=a#+1
   prozent#=a#/Dateigroesse2#
   prozent#=prozent#*100
   AppTitle prozent#+"%"
   Byte=WriteBytes (Speicherfeld2, Datei2, 0, Dateigroesse2)
Until a# >= Dateigroesse2#
Print "Datei angekommen"
WaitKey()

Hip Teen

BeitragMo, Feb 18, 2008 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Du erstellst eine bank ohne eine Größenangabe. Ist OK, aber dann besitzt sie ja keine Größe. Dann willst du in diese 0 Byte große Bank Daten reinschieben. Wird nicht klappen. Also: Bank vergrößern.
Du brauchst übrigens nicht gleich die ganze Datei in eine Bank schieben (dann macht die Prozentangabe auch wenig Sinn, du hast dann entweder 0 oder 100 Prozent Rolling Eyes ). Kannst ja so ~10-100kb pro Durchlauf kopieren, je nachdem wie fein du die Schritt machen willst.
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

mabox

BeitragDi, Feb 19, 2008 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Das heißt ich müsste dann z.B. beim Server hinschreiben: Code: [AUSKLAPPEN]
Speicherfeld1 = CreateBank(Dateigroesse1)

Hip Teen hat Folgendes geschrieben:
Du brauchst übrigens nicht gleich die ganze Datei in eine Bank schieben (dann macht die Prozentangabe auch wenig Sinn, du hast dann entweder 0 oder 100 Prozent Rolling Eyes ). Kannst ja so ~10-100kb pro Durchlauf kopieren, je nachdem wie fein du die Schritt machen willst.
Was meinst du damit?
Wenn ich immer nur 10kb in einem Schleifendurchlauf schicke geht es ja wieder ganz langsam und das gerade will ich ja nicht.

Code: [AUSKLAPPEN]
Byte=WriteBytes (Speicherfeld2, Datei2, 0, Dateigroesse2)
muss ich dann statt "Dateigroesse2", 10 hinschreiben?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group