FTP Verbindung sofort abgebrochen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Macros
Beiträge: 1367
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

FTP Verbindung sofort abgebrochen

Beitrag von Macros »

Hallo PBler

Vorgeschichte, Frage gibts im nächsten Absatz. Ich hab Purebasic wieder ausgepackt und mir überlegt, was ich machen will. Dabei kam ich darauf, mir ein Programm zu machen, dass die Episodenbeschreibungen für Babylon 5 herunterlädt. Hab ich mir kürzlich komplett zugelegt. Bald war ich fertig. Dann kanm mir die Idee, dass das Programm doch auch gleich einen druckbaren Episodenguide erzeugen könnte. Begann mich in LaTeX einzuarbeiten und ein LaTeX Include zu schreiben. funktioniert nun auch :)
Das Include werde ich nach Überarbeitung online stellen.
Schließlich wollte ich die IMDB Bewertungen der Episoden mit hineinbringen. Da mein Programm später auch für andere Serien funktionieren soll, sollte es sie automatisch holen. Sie liegen hier: ftp://ftp.fu-berlin.de/pub/misc/movies/ ... gs.list.gz doch der FTP Download will nicht klappen.

Ich habe mir eine kleine Funktion geschrieben um vom FTP-Server Dateien herunterzuladen. Leider schließt der sofort nach dem erfolgreichen OpenFTP die Verbindung. Kann mir jemand verraten, woran das liegt und wie ich es umgehen kann?

Minimalbeispiel:

Code: Alles auswählen

InitNetwork()
If OpenFTP(1,"ftp.fu-berlin.de","anonymous","")=0
  MessageRequester("Error","Could not connect to Ftp Server")
Else
  Debug "Connection state: "+Str(CheckFTPConnection(1))
  Debug "Connected, dir is '"+GetFTPDirectory(1)+" ' "
EndIf
Kompletter Code (include):

Code: Alles auswählen

;- remove initnetwork!
InitNetwork()

Procedure FTPDownloadToFile(ftppath$,target_file$)
  
  Debug "FTP descend to dir"
  ftppath$=RemoveString(ftppath$,"ftp://")
  ; Descend  to target dir
  For a=1 To CountString(ftppath$,"/")
    part$=StringField(ftppath$,a,"/")
    If a=1 
      If OpenFTP(1,part$,"anonymous","")=0
        MessageRequester("Error","Could not connect to Ftp Server")
        ProcedureReturn -1
      Else
        Debug "Connected, Dir is '"+GetFTPDirectory(1)+" ' "
      EndIf
    Else
      If SetFTPDirectory(1,part$)=0
        ;- ##debug remove
        ExamineFTPDirectory(1)
        Debug "ftp connection state "+Str( CheckFTPConnection(1))
        Debug "dirlisting"
        Debug  "Name"+Chr(9)+"dir?"
        While NextFTPDirectoryEntry(1)
          Debug FTPDirectoryEntryName(1)+Chr(9)+Str(FTPDirectoryEntryType(1)-1)
        Wend
        ;- ##debug end
        MessageRequester("Error","Path seems wrong, cannot descent to"+Chr(10)+"'"+part$+"'")
        ProcedureReturn -1
      EndIf
    EndIf
  Next
  
  Debug "searching dir to get size"
  ;search file To get file size
  file$=StringField(ftppath$,CountString(ftppath$,"/")+1,"/")
  If ExamineFTPDirectory(1)
    While NextFTPDirectoryEntry(1)
      name$=FTPDirectoryEntryName(1)
      If name$=file$
        size=DirectoryEntrySize(1)
        Break
      EndIf
    Wend    
  Else
    MessageRequester("Error","Cannot scan target Directory")
    ProcedureReturn -1
  EndIf

  
  Debug "FTP Downloading"
  If ReceiveFTPFile(1,file$,target_file$,#True) And size
    win=OpenWindow(#PB_Any,0,0,400,100,"FTP Download "+file$,#PB_Window_ScreenCentered)
    text=TextGadget(#PB_Any,5,5,390,30,"Startup",#PB_Text_Center)
    progress=ProgressBarGadget(#PB_Any, 5,45,390,50,0,size,#PB_ProgressBar_Smooth)
    Repeat
      WaitWindowEvent(20)
      status=FTPProgress(1)
      Select status
        Case #PB_FTP_Started
          SetGadgetText(text,"connecting ...")
        Case #PB_FTP_Error
            SetGadgetColor(text,#PB_Gadget_FrontColor,$FF)
            SetGadgetText(text,"ERROR!")
            MessageRequester("Error","File Download encountered an Error")
            CloseWindow(win)
            ProcedureReturn -1
          Case #PB_FTP_Finished
            SetGadgetColor(text,#PB_Gadget_BackColor,$FF00)
            SetGadgetText(text,"Finished")
            Delay(500)
          Default
            SetGadgetText(text,"Downloading...")
            SetGadgetState(progress,status)
        EndSelect
      Until status=#PB_FTP_Finished   
  Else
    MessageRequester("Error","File download could not be started")
    ProcedureReturn -1
  EndIf
      
EndProcedure

;- remove test
Debug FTPDownloadToFile("ftp.fu-berlin.de/pub/misc/movies/database/ratings.list.gz","ratings.list.gz")
Zuletzt geändert von Macros am 03.07.2012 18:11, insgesamt 1-mal geändert.
Bild
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: FTP Verbindung sofort abgebrochen

Beitrag von Kiffi »

örzmal 2 kleine Anmerkungen:

der Pfad ist nicht korrekt (pub gibt es nicht):

Code: Alles auswählen

ftp.fu-berlin.de/pub/misc/movies/database -> ftp.fu-berlin.de/misc/movies/database
und der Dateiname ist nicht korrekt (da hat Dir wohl die IDE aus dem kleinen 'l' ein grosses 'L' gemacht):

Code: Alles auswählen

ratings.List.gz -> ratings.list.gz
Und wenn es nur um den Download der Datei geht, kannst Du doch
URLDownloadToFile_() und Konsorten verwenden.

Oder willst Du das unbedingt via FTP machen?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Macros
Beiträge: 1367
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: FTP Verbindung sofort abgebrochen

Beitrag von Macros »

Doch der Pfad passt so, pub wird zwar nicht gelistet, aber gibt man die URL so im Browser oder an wget, klappt das problemlos.
Der Punkt mit l L stimmt. Ist aber irrelevant für das Problem. (korrigier ich gleich oben)

URLDownloadToFile_() und Konsorten sind natürlich ein Ausweg, wget in meinem Falle, siehe Signatur.
Hab auch schon vor 5 Minuten angefangen das zu programmieren, doch meine Includes sollen eigentlich Cross-Platform arbeiten. Zum Compilerif möchte ich nur im Notfall greifen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: FTP Verbindung sofort abgebrochen

Beitrag von Kiffi »

Macros hat geschrieben:Doch der Pfad passt so, pub wird zwar nicht gelistet, aber gibt man die URL so im Browser oder an wget, klappt das problemlos.
im Browser und im FileZilla wird der Pfad jedenfalls ohne 'pub'
angezeigt, aber vielleicht ist das so eine Linux-Geschichte, die
ich nicht verstehen muss.

Ich bekomme ja noch nicht einmal nach erfolgreichem Login eine
Auflistung des aktuellen Verzeichnisses. Auch das Wechseln in
andere Verzeichnisse schlägt fehlt.

Code: Alles auswählen

InitNetwork()

If OpenFTP(1, "ftp.fu-berlin.de","anonymous", "")
  Debug "OpenFTP(): OK"
Else
  Debug "OpenFTP(): Error"
  End
EndIf

If ExamineFTPDirectory(1)
  Debug "ExamineFTPDirectory(): OK"
  While NextFTPDirectoryEntry(1)
    Debug FTPDirectoryEntryName(1)
  Wend
Else
  Debug "ExamineFTPDirectory(): Error"
EndIf
Ich meine mich zu erinnern, dass Fred erwähnt hat, dass
nicht alle FTP-Server zu 100% unterstützt werden (zumindest
beim MS-FTP-Server gibt es Probleme). Vielleicht gehört
der FTP-Server der FU Berlin ebenfalls zu diesen 'Problemkindern'.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Macros
Beiträge: 1367
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: FTP Verbindung sofort abgebrochen

Beitrag von Macros »

Ich bezweilfe stark, dass die FU Berlin Windows Server verwendet. Mein Minimalbeispiel zeigt ja auch, dass die Verbindung sofort nach dem Aufbau wieder geschlossen wird, zumindest wars so unter Linux.

Inzwischen habe ich klein beigegeben, und die wget Lösung programmiert.
Die funktioniert und kann gemäß Handbuch auch nur mit Unix Servern umgehen. Scheint, glaubt man dem Buch, auch sogut wie nichts anderes zu geben. Selbst die Windows FTP Server verwenden das Unix Listing Format.
Hier der Code falls ihn jemand brauchen kann:
(Hinweis: wget gibts auch für Windows)

Code: Alles auswählen

  Procedure FTPDownloadToFile(ftppath$,target_file$)
    regex_prozent=CreateRegularExpression(#PB_Any,"[0-9]+[%]")
    Dim percent.s(0)
    
    win=OpenWindow(#PB_Any,0,0,400,100,"FTP Download "+file$,#PB_Window_ScreenCentered)
    text=TextGadget(#PB_Any,5,5,390,30,"Startup",#PB_Text_Center)
    progress=ProgressBarGadget(#PB_Any, 5,45,390,50,0,100,#PB_ProgressBar_Smooth)
    wget=RunProgram("wget",ftppath$+" -N -o wget.log",GetCurrentDirectory(),#PB_Program_Open)
    downloading=1
    While downloading 
      
      WindowEvent()
      Delay(10)
      
      If ProgramRunning(wget)
        ; parse status from logfile
        wget_log=ReadFile(#PB_Any,"wget.log")
        If wget_log
          size=FileSize("wget.log")
          tmp$=Space(size)
          ReadData(wget_log,@tmp$,size)
          tmp$=PeekS(@tmp$,size,#PB_Ascii)   ;Unicode Workaround
          num=ExtractRegularExpression(regex_prozent,tmp$,percent())
          If num
            status=Val(percent(num-1))
          Else
            status=#PB_FTP_Started
          EndIf        
          CloseFile(wget_log)
        EndIf
        
      Else 
        ; Finished, lets get the Status
        downloading=0
        If ProgramExitCode(wget)>0
          status=#PB_FTP_Error
        Else
          status=#PB_FTP_Finished
        EndIf
      EndIf
      
      Select status
        Case #PB_FTP_Started
          SetGadgetText(text,"connecting ...")
        Case #PB_FTP_Error
          SetGadgetColor(text,#PB_Gadget_FrontColor,$FF)
          SetGadgetText(text,"ERROR!")
        Case #PB_FTP_Finished
            SetGadgetColor(text,#PB_Gadget_BackColor,$FF00)
            SetGadgetState(progress,100)
            SetGadgetText(text,"Finished")          
        Default
          SetGadgetText(text,"Downloading...")
          SetGadgetState(progress,status)
      EndSelect
    Wend
    ; display finish message for a Moment
    For a=1 To 50
      WindowEvent()
      Delay(20)
    Next
    
    DeleteFile("wget.log")
    CloseWindow(win)
    If status=#PB_FTP_Error
      ProcedureReturn 0      
    EndIf
    ProcedureReturn 1
  EndProcedure
Bild
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: FTP Verbindung sofort abgebrochen

Beitrag von Kiffi »

Macros hat geschrieben:Ich bezweilfe stark, dass die FU Berlin Windows Server verwendet.
wo habe ich das behauptet?
Macros hat geschrieben:Mein Minimalbeispiel zeigt ja auch, dass die Verbindung sofort nach dem Aufbau wieder geschlossen wird, zumindest wars so unter Linux.
Dein Minimalbeispiel zeigt, dass man sich mit diesem FTP-Server verbinden kann. Mehr aber auch nicht.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Macros
Beiträge: 1367
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: FTP Verbindung sofort abgebrochen

Beitrag von Macros »

Du hattest MS-Server mögliche Fehlerursache erwähnt.
zumindest beim MS-FTP-Server gibt es Probleme
Auf meinem System gibt im Beispiel die Zeile

Code: Alles auswählen

Debug "Connection state: "+Str(CheckFTPConnection(1))
"Connection state: 0"
aus. Was ja nur Nanosekunden nach dem Aufbau der Verbindung ausgeführt wird. Fand ich reichlich seltsam.
Bild
Antworten