Página 1 de 1

FTP - Travamento em List()

Enviado: 03 Out 2008 17:06
por leandrolinauer
:{ Amigos do fórum, um problemão:

Tenho uma função em loop que executa : CONECTA - DOWNLOAD, EXECUTA, UPLOAD - DESCONECTA.
A mesma função trava ao passar pelo comando LIST() do FTP fica parado cerca de 12 a 15 minutos mais ou menos exatamente neste ponto: oFTP:List(Arquivo)

Ao voltar a funcionar automaticamente ele me indica uma nova conexão oFTP:Open().

Notei que a conta do FTP continua no ar sem problema, consigo conectar e verificar usando FTPCOMMANDER., tudo bem que ele não consiga permanecer horas conectado diretamente contínuo, mas a demora no comando LIST() atrapalha tudo.

Verifiquei que para o commando Open() da classe oFTP: existe um contador, que é nConnection:=20000 em millisegundos, eu gostaria de saber se há tbem para os demais comandos porque os testes que fiz em nConnection só afeta o Open() o comando LIST() continua travando e ficando parado 15 minutos, voltando a funcionar logo após este tempo.

No arquivo de biblioteca do xHarbour aonde tem explicadinho o comando FTP não fala nada de tempo para outros comandos, mas quem sabe há alguma saída.

Grato, pela ajuda de todos.
:-Y

Re: FTP - Travamento em List()

Enviado: 06 Out 2008 12:38
por sygecom
Post um pequeno exemplo de como esta usando !!!

Re: FTP - Travamento em List()

Enviado: 07 Out 2008 14:53
por leandrolinauer
Abaixo o verificador da conexao

esta parando aonde esta escrito isto:

//esta parando nesta linha e aguardando 15 minutos
If oFTP#Nil.And.!Empty(oFTP:List(n_FDown)) //se nao for vazio efetue o download esta parando aqui


Já usei de varias formas, todas ficam travado, usei tbem o listfile() trava tbem.

Código: Selecionar todos

Function MONITORE_FTP(oFunction,d_FTP,aLOAD)
aLOAD:=If(aLOAD=Nil,"FTP",aLOAD) //nao uso mais
If oFunction=="CONECTA".Or.oFTP=Nil //se desconectar volta a conectar
   ShowWaitMonitore(aLOAD +" - Localizando a conta "+oFTP_Server+"...","W+/N")
   cUrl :=oFTP_Proto+oFTP_User+":"+oFTP_Pass+"@"+oFTP_Server //+d_FTP+"/"
   oUrl :=turl():new(curl)
   oCred:=tIPCredentials()
   oFTP :=tIPClientFtp():NEW(oUrl,,.T.)
   oFTP :nConnTimeOut:=10000 //20000
   oFTP :bUsePasv    :=.T.
   ShowWaitMonitore(aLOAD +" - Tentando conexÆo com a conta "+oFTP_Server+"...","W+/N")
   If oFTP:OPen() //Connecta()
      ShowWaitMonitore(aLOAD +" - Conectando com a conta de FTP...","G+/N")
      oFTP_Con++
   Else
      ShowWaitMonitore(aLOAD +" - Desconectado da conta de FTP...","R+/N")
      a_FTP:="DESCONECTADO"
      oFTP :CLOSE() //desconecta()
      oFTP :=Nil
   EndIf
EndIf
If oFunction=="MONITORA"
   ShowWaitMonitore(aLOAD +" - Comunicando com o FTP...","G+/N")
   If oFTP#Nil
      If oFTP :Cwd(d_FTP) //vai no diretorio ftp escolhido
         ShowWaitMonitore(aLOAD +" - Direcionando para "+d_FTP+"...","W+/N")
         a_FTP:="CONECTADO"
      Else
         ShowWaitMonitore(aLOAD +" - NÆo direcionei para "+d_FTP+"...","W+/N")
         a_FTP:="DESCONECTADO"
         oFTP :CLOSE() //desconecta()
         oFTP :=Nil
         oFTP_RCon++ //encrementa a recone‡Æo
      EndIf
   EndIf
EndIf
If oFunction=="DESCONECTA"
   ShowWaitMonitore("Desconectando da conta de FTP...","W+/N")
   a_FTP:="DESCONECTADO"
   If oFTP#Nil
      oFTP:CLOSE() //desconecta()
      oFTP:=NIL
   EndIf
EndIf
Return a_FTP=="CONECTADO"

Static Function FTP_COMUNICA(a_HANDLE,iH)
// (a_HANDLE[iH,1],oFTP_DIR+a_HANDLE[iH,1]+"/",a_HANDLE[iH,5],a_HANDLE[iH,6],a_HANDLE[iH,3],a_HANDLE[iH,4])
Local d_FTP  :=oFTP_DIR+a_HANDLE[iH,1]+"/"
Local aLoad  :="FTP"
Local vLOJA  :=a_HANDLE[iH,1]
Local n_PUp  :=a_HANDLE[iH,3]
Local n_FUp  :=a_HANDLE[iH,4]
Local n_PDown:=a_HANDLE[iH,5]
Local n_FDown:=a_HANDLE[iH,6]
If MONITORE_Ftp("MONITORA",d_FTP,aLOAD) //VERIFICA COMUNICANDO E POSICIONA NA PASTA
   If !File(n_PDown+n_FDown)
      ShowWaitMonitore("Verificando a existˆncia do arquivo "+n_FDown+"...","G+/N")

//esta parando nesta linha e aguardando 15 minutos
      If oFTP#Nil.And.!Empty(oFTP:List(n_FDown)) //se nao for vazio efetue o download esta parando aqui


         If oFTP#Nil.And.oFTP:DownLoadFile(n_PDown+n_FDown) //baixa do FTP
            ShowWaitMonitore("Recebendo arquivo "+n_FDown+"...","G+/N")
            ShowWaitMonitore("Origem : "+vLOJA+" - "+d_FTP  +"...","B+/N")
            ShowWaitMonitore("Destino: "+vLOJA+" - "+n_PDown+"...","B+/N")
            ShowWaitMonitore("Exclu¡ndo arquivo "+n_FDown+" da conta FTP...","GR+/N")
            oFTP:Dele(n_FDown)                 //Deleta do FTP
         Else
            ShowWaitMonitore("Falha ao receber arquivo "+n_FDown+"...","R+/N")
         EndIf
      Else
         ShowWaitMonitore(n_FDown+" nÆo dispon¡vel para receber da loja: "+vLOJA+"...","GR+/N")
      EndIf
   EndIf
   //upload
   //se loja 0001 nao envia apenas apaga
   If File(n_PUp+n_FUp) //.And.vLOJA#"0001"
      If oFTP#Nil.And.Empty(oFTP:List(n_FUp)) //se vazio nao achou envia
         ShowWaitMonitore("Enviando arquivo "+n_FUp+"...","B+/N")
         ShowWaitMonitore("Origem : "+vLOJA+" - "+n_PUp+"...","B+/N")
         ShowWaitMonitore("Destino: "+vLOJA+" - "+d_FTP  +"...","B+/N")
         If oFTP#Nil.And.oFTP:UpLoadFile(n_PUp+n_FUp) //enviar para FTP
            ShowWaitMonitore(vLOJA+" - Exclu¡ndo arquivo "+n_FUp+" do disco local...","GR+/N")
            FErase(n_PUp+n_FUp)         //deleta da pasta
         Else
            ShowWaitMonitore(vLOJA+" - Falha ao enviar arquivo "+n_FUp+"...","R+/N")
         EndIf
      Else
         ShowWaitMonitore(n_FUp+" existente em "+d_FTP+"...","R+/N")
         ShowWaitMonitore("Provavelmente a LOJA "+If(wLoja#"0001","MATRIZ",vLOJA)+" est  desconectada do MONITORE...","R+/N")
      EndIf
   Else
      ShowWaitMonitore(n_FUp+" nÆo dispon¡vel para enviar para loja: "+vLOJA+"...","GR+/N")
   EndIf
EndIf
Return .T.

//abaixo a função de monitoramento da base de dados

procedure x.....
daqui 
............
até aqui abertura de arquivos

   If wNetUse=.T. //ENTRA PARA PROCESSAR
      OpenWindow(02,00,22,79,"Log do monitoramento [FINALIZAR - Tecle ESC]","","GR+/B","G+/N")
      @ 22,00 Say PadC("",80," ") Color("GR+/R")
      wSaida :=.F.

      //CONECTAR ANTES DE INICIAR O CICLO
      MONITORE_Ftp("CONECTA") //VERIFICA COMUNICANDO E POSICIONA NA PASTA

      While wSaida=.F. //FICA NESTA ROTINA AT SER TIRADO
        wSaida:=ExitSeek()
        //************ INICIO DO FTP **************************************//

        For iH:=1 To Len(a_HANDLE)  // est for é da loja 1 até a final
            ShowWaitMonitore("Monitorando dados da loja - "+a_HANDLE[iH,1]+"...","G+/N")
            FTP_COMUNICA(a_HANDLE,iH)
            MONITORE_Processa(a_MFILE,a_HANDLE,iH)
        Next

        //************ FIM DO FTP **************************************//
      End

      MONITORE_Ftp("DESCONECTA") //desconecta com o FTP
      //DESCONECTA
      CloseWindow()
   Else
      ShowMessage(,,"MONITORE - Falha na abertura do BANCO de DADOS, opera‡Æo cancelada.",0)
   EndIf
   DbCloseAll()

fechamento da funcao
FIM.
Assim que eu tiver totalmente funcional, postarei aqui no fórum ela completa e limpado as sujeiras.

Grato
:xau

Re: FTP - Travamento em List()

Enviado: 11 Out 2008 12:23
por sygecom
Tente colocar um oFTP:reset() antes da linha que esta trancando.

Re: FTP - Travamento em List()

Enviado: 14 Out 2008 14:24
por leandrolinauer
Boa tarde,

Fiz varios testes com o comando Reset() na classe oFTP, mas no entanto continua da mesma forma creio que o problema é que deve cair a conexão por algum motivo bem no comando LIST() ou DOWNLOADFILE(), só que ao invés do programa fechar imediatamente e refazer a conexão ele fica esperando exatos 15 minutos, o que eu não entendo porque este tempo, visto que logo passado o tempo o mesmo reconecta imeditamente e começa o clico outra vez.

Não da pra entender o porque da demora.


Grato
Leandro 8-|

Re: FTP - Travamento em List()

Enviado: 15 Out 2008 16:07
por Dudu_XBase
Boa tarde.
Faça o teste no ms-dos.
Faça a conexão via comando do ftp...

open ftptalparararaparara
list

Verifica se dá tb o timeout.
Lembrando o Ftp trabalha com duas portas a 20 e a 21. A porta 21 é para o trafego do dados (arquivos) e a porta 20 é para o trafego dos comandos.
Desabilite o firewall do seu micro e faça um teste.
Se o Servidor FTP é configurável tente tb utilizar portas mais altas como exemplo portas 20020 e 20021.

Re: FTP - Travamento em List()

Enviado: 15 Out 2008 17:31
por leandrolinauer
Boa tarde Dudu.
Obrigado pela ajuda.

Eu teria que ficar fazendo o comando list() até dar um time out, o problema é que nem agora neste momento ele ficou conectado 1 hora 44 minutos sem dar nenhuma reconexão, aí que mora o problema é desconhecido a hora em que vai travar no comando só sei que fica 15 minutos até liberar e refazer a conexão, quanto a isto não é problema a reconexão o problema são os 15 minutos aguardando sair do comando LIST() ou DOWNLOADFILE() este timeout padrão que existe na classe FTP que eu precisaria mudar para uns 2 minutos, porque se ele não conseguir descobrir nada em 2 minutos é porque esta travado aí ele iria para nova conexao Open().

Este é o meu problema.

Eu já verifiquei na internet existe o time out de 15 minutos default que pelo comando de DOS FTP vc tem como mudar com o a letra -t e colocar o valor que vc quer que ele fique aguardando, que no meu caso como apenas esta verificando se existe arquivo o timeout deveria ser de apenas 2 minutos e para downloadfile seria mais.

Como na classe oftp tem como mudar o timeout da conexao OPEN() eu gostaria de mudar exemplo:
oFtp:nConnTimeOut:=20000 //posso mudar para 1000 = um segundo
será que há algo que indique o timeout de leitura, download, etc... do comando.

algo:
oFtp:nOperTimeOut:=1000 // exemplo chutei o nome da subclasse "nOperTimeOut" (não testei esta ainda), mas ja tentei com outras : nTimeOut, iTimeOut etc etc etc etc

O problema que na biblioteca de ajuda do xharbour na classe FTP não tem este comando igual tem não tinha o oFTP:Reset() QUE ME PASSARAM, que funciona normal apenas não vi nenhum alteração na execução do mesmo.

Ja fiz a mudando para ele conectar, processar, desconectar, ou seja, fazer um OPEN a todo instante mas tbem não deu certo, certa hora ele para no LIST ou DOWNLOADFILE, que na verdade não esta travado apenas esta verificando se há o arquivo.

Fico grato se alguem tbem puder me passar alguma forma de saber o nome das subclasses criadas através do tIPClientFTP, que já coloquei para visualizar que são 30 e o conteúdo de cada, mas o nome da classe não consegui mostrar.

Grato pela colaboração de todos, falta apenas isto para resolver o problema do monitoramento via FTP.

Um xabraço a todos. ({)
X:)