Problem mit TCP/IP FileTransfer

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

hazumu-kun

Betreff: Problem mit TCP/IP FileTransfer

BeitragSo, Sep 21, 2008 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe mich mal rangemacht einen Dateitransfer für die nächste anstehende Lan-Party zu coden aber im Clienten scheint sich ein gut versteckter bug zu befinden, könnt ihr mir helfen?

Client-Programm:

Code: [AUSKLAPPEN]
;//// Variablen / Konstanten ////
Global ServerIP$,Path$,Filename$,Size%,MaxPackSize%,PackCount%
Const Port= 21
Const PortID$= "FTP"
Const Timeout= 1000

;//// Hauptprogramm ////
AppTitle "VE LanFileTransfer - Client"

;// Client starten //
Print "Starte Clienten..."
.GetIP
ServerIP$= RequestString$("Server IP eingeben","0.0.0.0")
If ServerIP$="" Then Endprog():Goto GetIP
Print ""
path$= RequestDir$("Speicherort wählen","shell:Personal")

;/ Mit Server verbinden /
.ConnectServer
Print "Verbinde mit: "+ServerIP$+"..."
Print "Port: "+Port+"("+PortID$+")"
Stream= OpenTCPStream (ServerIP$,Port)
If Stream=0 Then
   Print "Verbindung konnte nicht hergestellt werden!"
   inp$= Input$ ("Wiederholen(W) Neue IP eingeben(N) oder Abbrechen(A)?")
   inp$= Lower$(inp$)
   If inp$= "n" Then
      Goto GetIP
   ElseIf inp$="w"
      Goto ConnectServer
   ElseIf inp$="a"
      Endprog()
      Goto ConnectServer
   EndIf
EndIf
Print "Verbindung hergestellt."
Print "Sende Anfrage an Server..." ;Zweiseitige Überprüfung starten.
WriteLine Stream,1
If StreamInput$(Stream,Timeout)<>"" Then
   WriteLine Stream,1               ;Dateiname anfordern
Else
   Print "Keine Anwort vom Server, Programm wird beendet."
   CloseTCPStream Stream
   Input("Druecken sie Enter zum Beenden")
   End
EndIf
;/ Dateiinformationen übertragen /
Filename$= Waitanswer$(Stream,Timeout)   ;Dateiname empfangen
Print "Dateiname: "+Filename$
WriteLine Stream,1                  ;Dateigröße anfordern

Size= Waitanswer$(Stream,Timeout)      ;Dateigröße empfangen
Print "Dateigroesse: "+Size+"B"
WriteLine Stream,1                  ;maximale Packetgröße anfordern

MaxPackSize= Waitanswer$(Stream,Timeout);maximale Packetgröße empfangen
Print "Packetgroesse: "+MaxPackSize+"B"
WriteLine Stream,1                  ;Packetanzahl anfordern

PackCount= Waitanswer$(Stream,Timeout)   ;Packetanzahl empfangen
Print "Packetanzahl: "+PackCount
Dim Banks(Packcount-1)

;/ Übertragung starten /
For i=1 To Packcount
   Print ""
   Banks(i-1)= CreateBank(Maxpacksize)
   Print "Empfange Packet "+i+"/"+Packcount
   WriteLine Stream,1               ;Packet anfragen
   Repeat
      Time= Time+1
      Delay 1
      If ReadAvail(Stream) Then Goto GetPackage
   Until Time>Timeout
   Print "Keine Anwort vom Server, bestehende Packete werden geschrieben."
   CloseTCPStream Stream
   Goto SaveFile
   End
   .GetPackage
   ReadBytes (Banks(i-1),Stream,0,BankSize(Banks(i-1)))
   Print "Packet erfolgreich empfangen!"
Next
If Int(Waitanswer$(Stream,Timeout))<>0 Then
   Print "Uebertragung erfolgreich beendet."
EndIf
CloseTCPStream Stream

;/ Datei speichern /
.SaveFile
Print "Speichere Datei..."
Stream= WriteFile (Path$+Filename$)
For i= 1 To Packcount
   Print ""
   Print "Speichere Packet "+i+"/"+Packcount+"..."
   WriteBytes Banks(i-1),Stream,0,BankSize(Banks(i-1))
   Print "Gespeichert."
Next
CloseFile Stream
If FileType(Path$+Filename$)<>0 Then
   Print "Datei erfolgreich gespeichert."
Else
   Print "Fehler beim speichern."
EndIf
Input("Druecken sie Enter zum Beenden")


Input()
;//// Funktionen ////
Function RequestString$(RTitle$,RStand$)   ;Dialog mit Eingabefeld
   DW= Deskwidth()
   DH= DeskHeight()
   RW= 170
   RH= 55
   Rwin= CreateWindow (RTitle$,(DW-RW)/2,(DH-RH)/2,RW,RH,Desktop(),33)
   api_SetForegroundWindow (QueryObject(RWin,1))
   RIP= CreateTextField (5,5,160,20,Rwin)
   SetGadgetText RIP,RStand$
   ROK= CreateButton ("OK",60,30,50,20,Rwin)
   Repeat
      Select WaitEvent()
         Case $101
            If EventID()=1 Then Return ""
         Case $803
            Return ""
         Case $401
            If EventSource()=ROK Then Exit
      End Select
   Forever
   ROut$= TextFieldText$(RIP)
   FreeGadget Rwin
   Return ROut$
End Function

Function StreamInput$(InpStream,InpTimeout) ;Auf Input über den Netzwerk Stream warten
   Repeat
      If ReadAvail(InpStream)<>0 Then Exit
      Delay 1
      InpTime= InpTime+1
   Until InpTime>InpTimeout
   Return ReadLine$(InpStream)
End Function

Function WaitAnswer$(SSTream,STimeout)      ;Auf eine Antwort vom Server warten
   SInp$= StreamInput$(SStream,WTimeout)
   If SInp$<>"" Then
      Return SInp$
   Else
      Print "Keine Antwort vom Server, Programm wird beendet."
      CloseTCPStream SStream
      End
   EndIf
End Function

Function DeskWidth()
   Return ClientWidth(Desktop())
End Function
Function DeskHeight()
   Return ClientHeight(Desktop())
End Function

Function Endprog()   ;Programm schließen
   con= Proceed("Möchten sie das Programm beenden?",1)
   If con=1 Then End Else Return
End Function


Server Programm:
Code: [AUSKLAPPEN]
;//// Variablen / Konstanten ////
Global File$,Filename$,Size%,PackCount%
Const Port= 21
Const PortID$= "FTP"
Const MaxPackSize= 4096
Const Timeout= 1000

;//// Hauptprogramm ////
AppTitle "VE LanFileTransfer - Server"

;// Server erstellen //
.CreateServer
Print "Starte Server..."
Print "Port: "+port+"("+PortID$+")"
server= CreateTCPServer (port)
If server=0 Then
   Print "Server konnte nicht gestartet werden!"
   Print "Schliessen sie bitte alle FTP Programme!"
   inp$=Input$("Wiederholen(W) oder Abbrechen(A)?: ")
   inp$=Lower$(inp$)
   If inp$="w" Then Goto Createserver Else End
Else
   Print "Server gestartet!"
   AppTitle "Server gestartet!"
   con= Proceed("Moechten sie die Server-IP sehen?")
   If con=1 Then ExecFile ("GetIP\GetIP.exe")
   AppTitle "VE LanFileTransfer - Server"
EndIf

;// Datei auswählen //
.ChooseFile
File$= RequestFile$("Wählen sie eine Datei zum Übertragen.")
If file$="" Then Endprog():Goto ChooseFile
Print ""
Print "Datei: "+File$
Filename$= GetFilename$(File$)
Print "Dateiname: "+Filename$

;// Datei Prüfen //
check= FileType(file$)
If check= 0 Then
   Print ""
   Print "Datei existiert nicht(mehr)!"
   inp$= Input$("Neue Datei waehlen(N) oder Abbrechen(A)?: ")
   inp$= Lower$(inp$)
   If inp$= "n" Then
      Goto ChooseFile
   ElseIf inp$="a"
      Endprog()
      Goto ChooseFile
   EndIf
ElseIf check=2 Then
   con= Proceed ("Sie haben einen Ordner gewählt."+Chr$(10)+"Neue Datei Wählen?")
   If con<>1 Then Endprog()
   Goto Choosefile
EndIf

;// Datei in Packete spalten //
Print ""
Print "Teile Datei in Datenpackete..."
Size= FileSize (file$)
Print "Dateigroesse: "+Size+"B"
Print "Maximale Packetgroesse: "+MaxPackSize+"B"
PackCount= Ceil(Size/MaxPackSize)
Print "Anzahl benoetigter Packete: "+Packcount
FileStream= ReadFile(File$)

Print ""
Dim Banks(PackCount-1)
BSize=Maxpacksize
For i= 1 To Packcount
   Print "Erstelle Packet: "+i+"/"+PackCount+"..."
   
   If i=PackCount Then BSize= Size Mod MaxPacksize
   Banks(i-1)= CreateBank(BSize)
   ReadBytes (Banks(i-1),FileStream,0,BankSize(Banks(i-1)))
   Print "Packet erstellt!"
   Print ""
Next
Print "Alle Packete erfolgreich erstellt!"

Repeat
   .WaitConnection
   Print ""
   Print "Warte auf Verbindungsanfrage..."
   Repeat
      Delay 1
      Stream= AcceptTCPStream(server)
      Time= Time+1
      If Time>Timeout Then
         Print "Keine Anfrage erfolgt."
         Time= 0
         Goto WaitConnection
      EndIf
   Until Stream<>0
   Print "Verbindung hergestellt."
   If Waitrequest(Stream,Timeout)=1 Then   ;Zweiseitige Überprüfung starten.
      WriteLine Stream,1
   EndIf
   
   ;/ Übertragung starten /
   Print "Sende Dateinformationen..."
   If Waitrequest(Stream,Timeout) Then   ;Dateiname übertragen.
      WriteLine Stream,Filename$
   Else
      Goto WaitConnection
   EndIf
   If Waitrequest(Stream,Timeout) Then   ;Dateigröße übertragen
      WriteLine Stream,Size
   Else
      Goto WaitConnection
   EndIf
   If Waitrequest(Stream,Timeout) Then   ;Packetgröße übertragen
      WriteLine Stream,MaxPackSize
   Else
      Goto WaitConnection
   EndIf
   If Waitrequest(Stream,Timeout) Then   ;Packetanzahl übertragen
      WriteLine Stream,PackCount
   Else
      Goto WaitConnection
   EndIf
   Print "Gesendet."
   Print "Starte Dateiübertragung..."
   For i= 1 To PackCount      ;Packetübertragung
      Print ""
      If Waitrequest(Stream,Timeout) Then
         Print "Sende Packet "+i+"/"+Packcount+"..."
         WriteBytes Banks(i-1),Stream,0,BankSize(Banks(i-1))
      Else
         Print "Keine Antwort vom Client."
         CloseTCPStream(Stream)
         Goto WaitConnection
      EndIf
   Next
   WriteLine Stream,2
   Print "Uebertragung erfolgreich."
   Print ""
   CloseTCPStream Stream
Forever
Input()


;//// Funktionen ////
Function StreamInput$(InpStream,InpTimeout) ;Auf Input über den Netzwerk Stream warten
   Repeat
      If ReadAvail(InpStream)<>0 Then Exit
      Delay 1
      InpTime= InpTime+1
   Until InpTime>InpTimeout
   Return ReadLine$(InpStream)
End Function

Function WaitRequest(WStream,WTimeout)      ;Auf Anforderung vom Clienten warten
   If StreamInput$(WStream,WTimeout)<>"" Then
      Return 1
   Else
      Print "Keine Antwort vom Clienten, Verbindung wird beendet."
      CloseTCPStream WStream
      Return 0
   EndIf
End Function

Function Endprog()   ;Programm schließen
   con= Proceed("Möchten sie das Programm beenden?",1)
   If con=1 Then End Else Return
End Function

Function GetFilename$(GPath$)   ;Dateinamen aus Dateipfad filtern
   TurnedPath$=Turn$(GPath$)
   pos=Instr(TurnedPath$,"\")
   GFile$=Left$(TurnedPath$,pos-1)
   Return Turn$(GFile$)
End Function

Function Turn$(TString$)   ;String umdrehen
   For i= Len(TString$)-1 To 0 Step -1
      Turned$= Turned$+ Right$(TString$,1)
      TString$= Left(TString$,i)
   Next
   Return Turned$
End Function
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

da_poller

BeitragMo, Sep 22, 2008 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal wäre eine genauere beschreibung des fehlers nicht schlecht

hazumu-kun

BeitragDi, Sep 23, 2008 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich die Dateiübertragung starte, werden alle packete übertragen, dann schließt der Slient sich einfach, obwohl die Datei noch garnicht gespeichert ist.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group