TipClientFtp causa possível bloqueio no servidor FTP!

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem por Ceb »

Bom dia!

Tenho um Aplicativo (xHarbour 1.2.1) que faz Upload de pedido e Download do retorno em formato texto. Estou fazendo conexão para duas distribuidoras através da I2 Sofware ltda (i2.com.br), porém, uma delas causa um tipo de bloqueio, e o retorno mesmo sendo gerado pela distribuidora destino não cai na área para download. Então, na pausa programada de 10s entre uma tentativa e outra para pegar o retorno, eu conecto pelo ftp.exe do Windows, entro na pasta, dou "dir" e em seguida "quit", e só então meu Aplicativo consegue baixá-lo e processá-lo!

Já entrei em contato com a Distribuidora várias vezes e não consegui chegar a uma solução, mesmo citando que a outra distribuidora que também usa a i2 funciona perfeitamente. Pretendo também entrar em contato com a i2, porém, não sei se conseguirei ser atendido, uma vez que a relação deles é com as Distribuidoras.

Daí, venho aqui mais uma vez solicitar uma orientação de alguém que passou pela situação descrita acima e/ou tenha alguma dica que possa ajudar a solucioná-la.

Obs: Acredito que talvez falte um comando para "Atualizar" após estar conectado, mas não encontrei!

Código: Selecionar todos

FUNCTION FTP_DOWNLOAD(FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL, FTPDEL)
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .F. )
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
  aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP)
   IF LEN(aLISTA) > 0 //TEM ARQUIVO NO SERVIDOR FTP 
    oFtp:exGauge := ( @FtpProgress() )
    IF oFTP:DownLoadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP) 
      IF FTPDEL //SE PEDIU PARA BAIXAR E APAGAR O ARQUIVO
       DO WHILE .T.
        IF oFTP:DELE('/'+FTPDIR+'/'+ARQFTP) ; EXIT ; ELSE ; LOOP ; ENDIF
       ENDDO
      ENDIF
     oFTP:Close() ; RETURN(.T.)
    ELSE
     oFTP:Close() ; RETURN(.F.)  
    ENDIF
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()
ELSE
  RETURN(.F.)
ENDIF
RETURN(.T.)
//
FUNCTION FTP_UPLOAD(  FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL )
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .t. )
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA   
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
   oFtp:exGauge := ( @FtpProgress() )
   IF oFtp:UploadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP)
    oFTP:Close() ; RETURN(.T.)
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()  
ELSE
   RETURN(.F.)
ENDIF
RETURN(.T.)
//
FUNCTION FtpProgress( nSent, nTotal, oFtp )
LOCAL cProgress
LOCAL nRow := Row(), nCol := Col()
cProgress:= STR((nSent/nTotal)*100,4)+"%"
@ nRow,nCol-5 say cProgress
SetPos( MaxRow()-1, 0 )
SetPos( nRow, nCol )
RETURN .T.
//
Att,

Ceb
Editado pela última vez por Toledo em 08 Fev 2016 08:10, em um total de 1 vez.
Razão: O presente tópico foi movido da seção CA-Clipper, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com o Clipper.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem por JoséQuintas »

Não sei o que pode ser, mas com certeza isso não é Clipper, está no lugar errado.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

[RESOLVIDO]TipClientFtp causa possível bloqueio no servidor

Mensagem por Ceb »

Boa tarde!

JoséQuintas, obrigado por me avisar quanto a mensagem estar no local errado! Já fiz a notificação solicitando que a mesma seja movido para o local mais apropriado.

Quanto ao problema, consegui resolver: na função que faz o Download, inseri os seguintes comandos logo abaixo do IF oFTP:Open( cUrl ), ficando da seguinte maneira:

oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ; oFTP:Pwd()

Ficando o resto da função como postado anteriormente.

Muito obrigado a todos!

Att,

Ceb
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem por JoséQuintas »

Apesar que deve saber, mas em todo caso:
O cwd é pra trocar a pasta em uso, o diretório, igual DOS ou Windows.
Então uma opção seria usar o full path.

Código: Selecionar todos

cd ..
cd pasta

Código: Selecionar todos

cd \pasta
Só comentário:
Seria difícil alguém ajudar nisso, já que o problema era a pasta aonde o arquivo ficava, e não dava pra ninguém saber o lugar correto.... rs
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

Mensagem por Ceb »

JoséQuintas, boa noite e obrigado novamente por sua colaboração!

Em resposta ao seu comentário: "Seria difícil alguém ajudar nisso, já que o problema era a pasta aonde o arquivo ficava, e não dava pra ninguém saber o lugar correto.... rs" Permita-me discordar em parte, pois o problema acredito que não era onde ficava a pasta, pois se observar a função inicial que postei, ela recebe o nome da pasta que eu quero e monta/lista o arquivo assim: aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP), ou seja, pega a partir da raiz, não sendo necessário trocar pasta, devido a '/' no início e também porque é uma nova conexão e assim, acho que ela teria que cair na raiz.

Outra coisa interessante é que já utilizo esta mesma função para baixar atualizações e também fazer o mesmo procedimento para download de retornos de pedidos e ela funciona perfeitamente, somente para esta distribuidora que tive que adicionar: oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ; oFTP:Pwd(), ficando a função conforme abaixo.

Código: Selecionar todos

FUNCTION FTP_DOWNLOAD(FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL, FTPDEL)
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .F. ) //t cria log
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
   oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ;  oFTP:Pwd()
  aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP)
   IF LEN(aLISTA) > 0 //TEM O ARQUIVO NO SERVIDOR FTP 
    oFtp:exGauge := ( @FtpProgress() )
    IF oFTP:DownLoadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP) 
      IF FTPDEL //SE PEDIU PARA BAIXAR E APAGAR O ARQUIVO
       DO WHILE .T.
        IF oFTP:DELE('/'+FTPDIR+'/'+ARQFTP) ; EXIT ; ELSE ; LOOP ; ENDIF
       ENDDO
      ENDIF
     oFTP:Close() ; RETURN(.T.)
    ELSE
     oFTP:Close() ; RETURN(.F.)  
    ENDIF
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()
ELSE
  RETURN(.F.)
ENDIF
RETURN(.T.)
O mais interessante, era que meu programa ficava rodando e não achava o retorno. Sem fechá-lo, eu chamava o ftp.exe do windows, conectava, entrava na pasta, voltava para a raiz e saia em seguida, então meu programa que estava tentando pegar a resposta e não conseguia, agora consegue? Obs: mesmo se eu fechasse meu programa e o executasse novamente ele ainda assim não conseguia, somente após executar o ftp.exe!

No mais, muito obrigado!

Ceb
Responder