:{ 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
FTP - Travamento em List()
Moderador: Moderadores
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: FTP - Travamento em List()
Post um pequeno exemplo de como esta usando !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Re: FTP - Travamento em List()
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.
Assim que eu tiver totalmente funcional, postarei aqui no fórum ela completa e limpado as sujeiras.
Grato
:xau
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.
Grato
:xau
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: FTP - Travamento em List()
Tente colocar um oFTP:reset() antes da linha que esta trancando.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Re: FTP - Travamento em List()
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-|
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-|
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
Re: FTP - Travamento em List()
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.
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.
________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle
-
leandrolinauer
- Usuário Nível 3

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Re: FTP - Travamento em List()
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:)
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:)
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)