Timeout para acesso ao FTP

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

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Colegas,

Estou precisando fazer um "timeout" para execução de um .bat em que acesso o meu FTP.

O .bat está assim:

Código: Selecionar todos

@echo off
if [%1] == [] goto fim

:: Parametros
::=============================
:: 1 - host ftp
:: 2 - usuario
:: 3 - senha
:: 4 - pasta remota
:: 5 - pasta local
:: 6 - arquivo a ser excluído

set allusersprofile=
set appdata=
set commonprogramfiles=
set homepath=
set number_of_processors=
set os2libpath=
set processor_architecture=
set processor_identifier=
set processor_level=
set processor_revision=
set programfiles=
set userprofile=
set userdomain=

:: Cria o arquivo de script
::=============================
echo open %1           > exclui.ftp
echo user %2 %3       >> exclui.ftp
echo binary           >> exclui.ftp
echo prompt           >> exclui.ftp
echo cd %4            >> exclui.ftp
echo lcd %5           >> exclui.ftp
echo delete %6        >> exclui.ftp
echo bye              >> exclui.ftp


:: Executa o script no FTP
::=============================
set l1=--------------------
set l2=********************

echo %l2%%l2%%l2%%l2%>> exclui.log
echo.|date           >> exclui.log
echo.|time           >> exclui.log
echo %l1%%l1%%l1%%l1%>> exclui.log
ftp -s:exclui.ftp -n >> exclui.log
echo %l1%%l1%%l1%%l1%>> exclui.log
echo.                >> exclui.log
echo.                >> exclui.log

set l1=
set l2=


:: Exclui o arquivo de script
::=============================
del exclui.ftp
:fim
O problema é que às vezes o FTP trava na execução da linha

Código: Selecionar todos

echo delete %6        >> exclui.ftp
Às vezes também em outras.

Daí eu precisaria de uma forma de o programa que chamou o .bat prosseguir, abandonando o FTP.

Outra opção seria, usando a tipclient, substituir esse .bat. Mas eu não achei nada nessa tipclient que exclua arquivos do FTP, como o .bat faz.

Alguém me ajuda?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Porque não usar o Harbour hb_idle... por exemplo p/ essa tarefa ?
Não precisa do servidor FTP, pode fazer tudo via TCP/IP agora.
Por exemplo uma arquivo x na pasta y.
Basta rodar o serviço(novo) RPC do harbour no servidor.
E pedir qualquer coisa...

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Não conhecia essa função hb_idle. Achei no grupo este post: viewtopic.php?f=4&t=9004&p=50920&hilit=hb_idle#p50920. Mas ela não dá a sintaxe dessa função. Vi que ele menciona o Help do Harbour, mas eu não sei como acessar esse Help, que me seria muito útil.

Quando vc disse "pode fazer tudo via TCP/IP agora", vc está se referindo a este post: viewtopic.php?f=4&t=14845? Eu já o tinha visto, mas não estou conseguindo entender bem como fazer isso. Vi que a função hb_xerase() faria exatamente o que estou precisando, mas ainda não consegui usá-la. Não compila. Não sei se precisa de alguma lib nova.

Como faço?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Ola!
Uso da hbidle

Código: Selecionar todos

#include "hbmemory.ch"

PROCEDURE Main()

   LOCAL pH1, pH2, pH3, pH4
   LOCAL n := 0
   LOCAL aSign := { "|", "/", "-", "\" }
   LOCAL nPrev := Seconds()

   CLS
   ? "   Time:        Memory used:                          Milliseconds elapsed:"
   ?
   ? "Can you see it ??? :) Press any key or wait 30 seconds"
   ?
   ?
   @ 10, 2 SAY "Memory before Test() call " + hb_ntos( Memory( HB_MEM_USED ) )
   Test()
   @ 11, 2 SAY "Memory after Test() and before collecting " + hb_ntos( Memory( HB_MEM_USED ) )
   hb_gcAll()
   @ 12, 2 SAY "Memory after collecting " + hb_ntos( Memory( HB_MEM_USED ) )
   pH1 := hb_idleAdd( {||                             hb_DispOutAt( 0,  1, Time() ) } )
   pH2 := hb_idleAdd( {|| Test(),                     hb_DispOutAt( 0, 21, Memory( HB_MEM_USED ) ) } )
   pH3 := hb_idleAdd( {|| iif( n == 4, n := 1, n++ ), hb_DispOutAt( 0, 41, aSign[ n ] ) } )
   pH4 := hb_idleAdd( {||                             hb_DispOutAt( 0, 61, 1000 * ( Seconds() - nPrev ) ), nPrev := Seconds() } )

   ? ValType( pH1 ), pH1, ValType( pH2 ), pH2, ValType( pH3 ), pH3, ValType( pH4 ), pH4

   Inkey( 30 )
   IF ! Empty( pH3 )
      @ 14, 2 SAY "Delete task 3: " + hb_ValToStr( pH3 )
      hb_idleDel( pH3 )
   ENDIF
   IF ! Empty( pH2 )
      @ 15, 2 SAY "Delete task 2: " + hb_ValToStr( pH2 )
      hb_idleDel( pH2 )
   ENDIF
   IF ! Empty( pH1 )
      @ 16, 2 SAY "Delete task 1: " + hb_ValToStr( pH1 )
      hb_idleDel( pH1 )
   ENDIF
   IF ! Empty( pH4 )
      @ 17, 2 SAY "Delete task 4: " + hb_ValToStr( pH4 )
      hb_idleDel( pH4 )
   ENDIF

   @ 18, 2 SAY "Memory after idle states " + hb_ntos( Memory( HB_MEM_USED ) )
   hb_gcAll()
   @ 19, 2 SAY "Memory after collecting " + hb_ntos( Memory( HB_MEM_USED ) )

   RETURN

STATIC PROCEDURE Test()

   LOCAL a, b, c
   LOCAL cb

   a := Array( 3 )
   b := Array( 3 )
   c := Array( 3 )
   a[ 1 ] := a
   a[ 2 ] := b
   a[ 3 ] := c
   b[ 1 ] := a
   b[ 2 ] := b
   b[ 3 ] := c
   c[ 1 ] := a
   c[ 2 ] := b
   c[ 3 ] := c

   cb := {| x | x := cb }
   Eval( cb )

   RETURN
Como usar as funções novas hb_fv*
Primeiro compilar os fontes do servidor hbnetio.exe
cd ...\contrib\hbnetio\utils\hbnetio
hbmk2 hbnetio.hbp
rodar o servidor com o RPC ativo
hbnetio -RPC //tem outros exemplos
Fazer os testes:

Código: Selecionar todos

REQUEST HB_IOTCP

PROCEDURE Main( cAddr )

   LOCAL hFile, cData, cSend, cEOL, nLen

   IF Empty( cAddr )
      cAddr := "tcp:localhost:2941"
   ENDIF

   If empty( hFile := hb_vfCreate('c:\teste\teste.txt') )
      ? "open:", cAddr
   ELSE
      cEOL := e"\r\n"

      cSend := "TESTE DE GRAVAÇÃO" + cEOL
      nLen := hb_vfWrite( hFile, cSend,, 1000 )
      ? ">>", StrTran( hb_BLeft( cSend, nLen ), cEOL, cEOL + ">> " )
      IF nLen != hb_BLen( cSend )
         ? "WRITE ERROR:", FError()
      ENDIF
      hb_vfClose( hFile )
      ? "closed, error:", FError()
   ENDIF
   ?
   WAIT

   RETURN

Static function hb_vfCreate( cFile, nModeAttr )

      local nNewAttr := hb_defaultValue( nModeAttr, 0 )

      nNewAttr := hb_bitAnd( nNewAttr, 0xFFFFFFFC )
      nNewAttr := hb_bitOr( nNewAttr, FO_READWRITE )
      nNewAttr := hb_bitOr( nNewAttr, FO_CREAT )

Return hb_vfOpen( cFile, nNewAttr )
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Itamar,

Muito obrigado pela disponibilidade em ajudar.

Tentei bastante, mas ainda não consegui entender bem o funcionamento da hbidle. Rodei várias vezes o teu exemplo, até entendi como ele funciona, mas não consegui entender como eu poderia usá-la no meu caso.

Uma coisa eu não entendi no teu exemplo: as informações de memória estão todas zeradas.

Pelo que pude entender, a hb_idleAdd() iniciaria a função que eu gostaria de rodar (no meu caso, o .bat que exclui o arquivo do FTP), sendo que esta função continuaria rodando sem travar o programa. É isso?

Daí vc poderia verificar depois se aquela função chamada antes pela hb_idleAdd() ainda está rodando, e, caso ainda esteja, matá-la com a hb_idleDel(). Seria isso?

Quanto às novas funções, não consegui achar o hbnetio.hbp. Aqui não tem pasta UTILS nem esse arquivo. Até baixei novamente a última versão do Harbour, mas ainda assim não consta.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

A função hbidleadd({||})
Faça um teste assim:

pFunçãoX := hb_idleadd({||alert("oi")} //Esse p(minusculo) significa variável do tipo POINTER, que é um número. O endereço na memória da função.
Para apagar ela usamos:
hb_idledel(pFunçãoX)
C:\fontes\XXXX>hbmk2 -find hb_idle*
Nucleo Harbour (instalado):
hb_idleAdd() //cria, adiciona a função
hb_idleDel() //apagar a função
hb_idleReset() //resetar ? não sei p/ quê!! deve ser p/ reativar
hb_idleSleep() //Parar a função sem apagar ela.
hb_idleState() //Verifica o estado da tarefa, se está em execução ou parada.
Executa uma função de tempos em tempos, que é passada via codblock.
Eu não sei se ela tem um timer como na função timer da Hwgui, que podemos definir o tempo de disparo.
Quanto a outra questão vc precisar baixar o Harbour mais novo. Eu tenho aqui os dois: O harbour principal e o Harbou do Viktor, todos dois já tem as pastas em questão.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Entendi a hb_idle e já estou fazendo uns testes no meu programa, muito obrigado.

Mas quanto à outra questão, eu baixei o Harbour mais novo deste site: http://sourceforge.net/projects/harbour ... e/download. Não é isso?

Como faço para baixar esse do Viktor?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Ola!
Esse endereço que vc postou, é do Harbour estável que só é atualizado depois de algum tempo.
Use esse aqui que é atualizado diariamente.
https://github.com/harbour/core/archive/master.zip

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Baixei.

Estranhei que não tem hbmk2.exe nessa versão. É isso mesmo?

Usando a versão que eu já tinha, compilei os fontes do servidor hbnetio.exe e rodei ele com o RPC ativo. Veja o que deu:

Imagem

Mas, ao tentar rodar o teu exemplo, não está compilando, dando falta da função HB_IOTCP. Copiei o arquivo iotcp.prg, mas mesmo assim não reconheceu.

Quanto à hb_idle, testei assim:

Código: Selecionar todos

              pH1 := hb_idleAdd( {|| __run("excltod " + ftps + " " + usftp + " " + snhftp + " " + ptftp+"copypen/agenda . " + arqexcl) } )
?hb_idleState(pH1)
O State está retornando NIL.
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Acredito que você está misturando tudo.
Vai mais devagar, releia as coisas que escrevi.
No harbour padrão e na distribuição do Viktor existe o hbmk2.exe, se vc não achou vc fez alguma coisa errado. Verifique o PATH.
Quando rodar o servidor hbnetio.exe aparece uma tela do windows perguntado se vai liberar o servidor p/ execução, vc precisa ter privilegio de admin!!!!!

Não tem mistério nenhum.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Timeout para acesso ao FTP

Mensagem por Toledo »

cjp escreveu:Estranhei que não tem hbmk2.exe nessa versão.
Itamar M. Lins Jr. escreveu:na distribuição do Viktor existe o hbmk2.exe
Amigos, no link que o Itamar postou é os fontes do Harbour, então tem que fazer a compilação dele para criar o arquivo hbmk2.exe.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Grato Toledo.
Porque eu uso direto o GIT, baixo os fontes e compilo.
Não sabia que o arquivo do link era apenas com os fontes sem os binários.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

De fato eu posso estar fazendo confusão. Vamos devagar.

Primeiro, quanto à função hb_idle(), vou tentar estudar um pouco mais, fazer mais uns testes, para tentar fazer funcioná-la.

Quanto à outra questão, consegui compilar o hbmk2.hbp que está na pasta utils\hbmk2, gerando o hbmk2.exe.

Mas, ao tentar compilar o hbnetio.hbp com esse hbmk2.exe, deu o seguinte erro:

Imagem

Como faço?
Inacio de Carvalho Neto
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Timeout para acesso ao FTP

Mensagem por Itamar M. Lins Jr. »

Apaga tudo ai!!!
Leia o arquivo readme.md do Harbour!
Está em inglês, mas não tem desculpa, qualquer programador tem o dever de saber alguma coisa básica do inglês. Caso contrário fica difícil p/ todos.
A tela em questão já está informando o que precisa ser feito.
Lembra no DOS, clipper quando nós informávamos o path ? pois é a mesma coisa.
Assumindo que vc está usando o compilador C da marca MINGW, caso ainda não tenha feito o download, pegue esse aqui:
http://sourceforge.net/projects/tdm-gcc ... e/download
Para instalar é NEXT,NEXT,NEXT FINISH!!!

Veja se está setado o PATH corretamente ai. Se por acaso, depois de instalado ele não modificar o PATH automaticamente.
VC deve colocar no PATH, lá no Painel de controle do windows etc,etc..., para não precisar ficar setando o tempo todo.
set PATH=C:\TDM-GCC-32\bin;%PATH%
Repetindo:
Verifique o seu PATH se tem um caminho apontando onde se encontra o GCC (que é o nome do compilador) teste ai assim:
gcc --version
deve aparece algo assim:

Código: Selecionar todos

C:\fontes\xyz>gcc --version
gcc (tdm-2) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Se vc for criar os binários do Harbour a partir dos fontes.(recomendo)
https://github.com/harbour/core/archive/master.zip

Basta ter apenas o MINGW instalado.

Criar um pasta de nome C:\HB32 Onde vai ficar os arquivos "*.EXE, DLL, etc" do Harbour.
SET HB_INSTALL_PREFIX=C:\HB32
Já deixe também padrão no Ruindows, lá no painel de controle, sistema, variáveis de ambiente...

Entrar na pasta onde os fontes do Harbour foram expandidos. Os fontes!!!
Vamos supor que vc colocou os fontes do Harbour na pasta c:\devl\hb32
cd \devl\hb32
win-make clean install
Se fez tudo da forma como está descrito ai, é só correr p/ o abraço, caso contrário, é só perguntar.
Organização!!!
Os fontes vc coloca(expande) na pasta c:\devl\hb32
E Harbour que vc acabou de compilar vai ficar na pasta c:\hb32.
Tenha a atenção em duas coisas!!!!!
o PATH do MINGW e para onde o "win-maker" vai jogar os arquivos EXE,DLL do Harbour.

Se der algum erro ai, copie e cole seu PATH, na questão.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Timeout para acesso ao FTP

Mensagem por cjp »

Embora eu não seja programador profissional, o inglês não é o problema.

Eu não tinha o compilador C da MINGW instalado, mas instalei agora a partir da tua indicação.

Fiz o set PATH.

O GCC está exatamente como vc citou.

Criar os binários a partir dos fontes não foi o que eu já tinha feito antes? Fiz algo errado?

Testei agora, já não dá o erro anterior, mas ainda está dando erro:

Imagem
Inacio de Carvalho Neto
Responder