Problem mit TCP/IP FileTransfer
Übersicht

![]() |
hazumu-kunBetreff: Problem mit TCP/IP FileTransfer |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
erstmal wäre eine genauere beschreibung des fehlers nicht schlecht | ||
![]() |
hazumu-kun |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group