Clipper On Line • Ver Tópico - Usar Servidor de DNS no NETIO
Página 1 de 1

Usar Servidor de DNS no NETIO

MensagemEnviado: 19 Jul 2010 18:18
por asimoes
Senhores,

alguém já conseguiu usar um servidor de dns tipo no-ip ou dyndns com o netio?

[]´s

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 19 Jul 2010 18:36
por sygecom
Eu uso NO-IP sem problemas, apenas libero a porta do letodb no servidor redirecionando para o servidor onde está o letodb rodando (porta.: 2812 )

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 19 Jul 2010 21:20
por asimoes
Olá SYGECOM,

No LetoDB eu já faço assim, eu queria saber é no HB_NETIO

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 19 Jul 2010 22:34
por asimoes
Senhores,

Consegui acessar dbfs usando dyndns, o problema é que algumas funções do netio não funcionam com este tipo de acesso, funcionam somente com ip local. A netio deverá superar estes entraves, por hora o letodb está mais completo e funcional. Por exemplo para saber se um indice existe na pasta onde os dbs estão, criei uma função chamada existeindice(cIndice) na aplicação servidora.

IF!Netio_FuncExec("EXISTEINDICE","BOLETOS.CDX")
  CriaIndice("BOLETOS.CDX")
ENDIF


No letodb tem a função leto_file()

Resumindo, no letodb posso usar todas as funções que ele oferece usando ip local ou dns host,
no NetIO, somente com ip local, me corrijam se eu estiver errado, pelo menos fiquei tentando descobrir por horas e nada. Falta mais documentação sobre o uso desta lib.

[]´s

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 18 Ago 2010 12:21
por clipsis
Ola, boa tarde!

Antes de mais nada, sou iniciante em Harbour.

Vi os exemplos de clientes para NETio, segui da forma como aparecem.
Porém quando compilo apresenta a seguinte mensagem:

undefined reference to `HB_FUN_NETIO_FUNCEXEC'

uso uma expressão parecida como:

IF!Netio_FuncExec("EXISTEINDICE","BOLETOS.CDX") 
  CriaIndice("BOLETOS.CDX")
ENDIF


Mudando apenas o nome da função de : EXISTEINDICE para LOCALIZAINDICE

Preciso colocar algum comando no PRG ou no arquivo HBP, para resolver ?

Fico no aguardo e obrigado.

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 18 Ago 2010 13:18
por asimoes
Olá Clipsis,

Este programa que eu fiz é um servidor NetIO veja a função LOCALIZAINDICE(cIndice) no fonte SERVIDOR.PRG que verifica se existe o indice na pasta db\ como eu uso:

Na sua aplicação ficaria assim:
Na função Netio_FuncExec o primeiro parametro é o nome da função que está no servidor e o segundo parametro é o parametro passado para a função LOCALIZAINDICE

Adapte o fonte SERVIDOR.PRG a sua necessidade.

 IF !Netio_FuncExec("LOCALIZAINDICE","PONTO.CDX")
      NetUse(cServer,cDataBase,.T.)   
      INDEX ON DTOS(DATA) TAG I001  TO (cServer+"PONTO")
      INDEX ON DTOS(DATA) TAG I002 DESCEND TO (cServer+"PONTO")
      PONTO->(DBCLOSEAREA())
ENDIF


Fonte: SERVIDOR.PRG

#include "hwgui.ch"
#include "common.ch"
#include "windows.ch"
#include "guilib.ch"

FUNCTION Main( nPort, cIfAddr, cRootDir, xRPC, ... )

LOCAL   hWrite := Hash(), hRead:= HB_ReadIni( "CONFIG.INI" )
LOCAL   oTrayMenu
LOCAL  oIconIni:=HIcon():AddResource("ICON_2")
PRIVATE pListenSocket, c_Port:="2816", c_Path:="\DB", c_Addr:=Verifica_Ip()
REQUEST HB_DATETIME
MEMVAR->oIcon1     :=HIcon():AddResource("ICON_1")
MEMVAR->oIcon2     :=HIcon():AddResource("ICON_2")
MEMVAR->oMainWindow:=Nil
MEMVAR->oTimer     :=Nil

   IF !FILE("CONFIG.INI")
      hWrite["MAIN" ]           := Hash()
      hWrite["MAIN" ]["Desc" ]  := "Sistema Servidor - NetIO"
      hWrite["MAIN" ]["Ver"  ]  := "Versao 1.2"

      hWrite["CONFIGURACAO" ]             := Hash()
      hWrite["CONFIGURACAO" ]["Port"]     := c_Port
      hWrite["CONFIGURACAO" ]["Path"]     := c_Path
      hWrite["CONFIGURACAO" ]["Addres"]   := c_Addr
      HB_WriteIni( "CONFIG.INI", hWrite,"--- Inicio ---", "--- Fim ---" )
   ELSE
      c_Port:=hRead["CONFIGURACAO"]["Port"]
      c_Path:=hRead["CONFIGURACAO"]["Path"]
      c_Addr:=hRead["CONFIGURACAO"]["Addres"]
   ENDIF

   cServidorDB:='//'+c_Addr+':'+c_Port+'/'
   
   INIT WINDOW MEMVAR->oMainWindow MAIN TITLE "Servidor NetIO - "+cServidorDB
   
   pListenSocket := NetIO_mtServer( VAL(c_Port),c_Addr,,.T.)

   IF Empty(pListenSocket)
      MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port)
      EndWindow()
   ENDIF

   CONTEXT MENU oTrayMenu
      MENUITEM "Parar o Servidor"      ACTION PararServidor()
      MENUITEM "Reiniciar o Servidor"  ACTION IniciarServidor()
      SEPARATOR
      MENUITEM "Sair"                  ACTION Sair()
   ENDMENU

   Liga_Timer(MEMVAR->oMainWindow,.T.)

   MEMVAR->oMainWindow:InitTray( oIconIni,,oTrayMenu,"Servidor NetIO - "+cServidorDB )

   ACTIVATE WINDOW oMainWindow NOSHOW
   oTrayMenu:End()
      
RETURN Nil

FUNCTION MudaIcone   
STATIC nIcon 
MEMVAR oMainWindow
MEMVAR oIcon1
MEMVAR oIcon2
   IF nIcon = Nil
      nIcon:=1
   ENDIF
   Liga_Timer(oMainWindow,.F.)
   nIcon := IF(nIcon > 2, 1, nIcon)
   Muda_Icone(IF(nIcon=1,oIcon1,oIcon2))
   nIcon++
   Liga_Timer(oMainWindow,.T.)
RETURN Nil

FUNCTION Muda_Icone(oIconeX, cTexto)
LOCAL oIcon := oIconeX
MEMVAR oMainWindow   
   ShellModifyIcon( oMainWindow:handle, oIcon:handle)
   oMainWindow:Refresh()
RETURN Nil

FUNCTION Liga_Timer(oJanela,lLiga)
MEMVAR oTimer
   IF lLiga
      SET TIMER oTimer of oJanela VALUE 1000 ACTION {|| MudaIcone() }
   ELSE
      oJanela:oTimer:End()   
   ENDIF
RETURN Nil

FUNCTION Sair
MEMVAR oMainWindow
   Liga_Timer(oMainWindow,.F.)   
   oMainWindow:oTimer:End()   
   IF MsgNoYes("Deseja Realmente Sair do Programa ?","Aviso do Sistema")
      PararServidor()
      Liberar()
   ELSE
      Liga_Timer(oMainWindow,.T.)
      RETURN Nil
   ENDIF
RETURN Nil

FUNCTION Liberar
   EndWindow() 
   ExitProcess()
RETURN Nil

FUNCTION PararServidor
MEMVAR pListenSocket
   IF !Empty( pListenSocket )
      NetIO_ServerStop( pListenSocket )
      pListenSocket := NIL
      //MsgInfo( "Servidor foi parado em "+c_Addr+":"+c_Port)
   ENDIF
RETURN Nil

FUNCTION IniciarServidor
MEMVAR pListenSocket
   IF Empty(pListenSocket)
      PararServidor()
      pListenSocket := NetIO_mtServer( VAL(c_Port),c_Addr,,.T.)
      IF Empty(pListenSocket)
         MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port)
         EndWindow()
      ELSE
         MsgInfo( "Servidor foi inicializado em "+c_Addr+":"+c_Port)
      ENDIF
   ENDIF
RETURN Nil

FUNCTION Verifica_Ip
LOCAL aHosts, cName, cEstacao:=netname(.f.)
hb_InetInit()
aHosts := hb_InetGetHosts( cEstacao )
IF aHosts == NIL
   aHosts := hb_InetGetAlias( cEstacao )
ENDIF
IF Empty(aHosts)
   aHosts := hb_InetGetAlias( cEstacao )
ENDIF
hb_InetCleanup()
RETURN  ahosts[1]

FUNCTION LOCALIZAINDICE(cIndice)
LOCAL lOk:=.F.
IF FILE("DB\"+cIndice)
   lOk:=.T.
ENDIF
RETURN lOk

#pragma BEGINDUMP

#define _WIN32_IE      0x0500
#define HB_OS_WIN_32_USED
#define _WIN32_WINNT   0x0400
#include <shlobj.h>
#include <windows.h>
#include <commctrl.h>
#include "hbapi.h"
#include "hbapiitm.h"

HB_FUNC( SHOWERROR )

{
   LPVOID lpMsgBuf;
   DWORD dwError  = GetLastError();

   FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      dwError,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
      (LPTSTR) &lpMsgBuf,
      0,
      NULL
   );
   
   MessageBox(NULL, (LPCSTR)lpMsgBuf, "Shutdown", MB_OK | MB_ICONEXCLAMATION);
   // Free the buffer.
   LocalFree( lpMsgBuf );
}

HB_FUNC( ENABLEPERMISSIONS )

{
   LUID tmpLuid;
   TOKEN_PRIVILEGES tkp, tkpNewButIgnored;
   DWORD lBufferNeeded;
   HANDLE hdlTokenHandle;
   HANDLE hdlProcessHandle = GetCurrentProcess();

   OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hdlTokenHandle);

   LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid);

   tkp.PrivilegeCount            = 1;
   tkp.Privileges[0].Luid        = tmpLuid;
   tkp.Privileges[0].Attributes  = SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hdlTokenHandle, FALSE, &tkp, sizeof(tkpNewButIgnored), &tkpNewButIgnored, &lBufferNeeded);
}

HB_FUNC( EXITWINDOWSEX )

{
   hb_retl( ExitWindowsEx( (UINT) hb_parni( 1 ), (DWORD) hb_parnl( 2 ) ) );
}

HB_FUNC( LOADTRAYICON )
{
   HICON himage;
   HINSTANCE hInstance  = (HINSTANCE) hb_parnl(1);  // handle to application instance
   LPCTSTR   lpIconName = (LPCTSTR)   hb_parc(2);   // name string or resource identifier

   himage = (HICON) LoadImage( hInstance ,  lpIconName , IMAGE_ICON, 16, 16, LR_SHARED ) ;

   if (himage==NULL)
   {
      himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ) ;
   }

   hb_retnl ( (LONG) himage );
}

HB_FUNC( LOADMAINICON )
{
   HICON himage;
   HINSTANCE hInstance  = (HINSTANCE) hb_parnl(1);  // handle to application instance
   LPCTSTR   lpIconName = (LPCTSTR)   hb_parc(2);   // name string or resource identifier

   himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_DEFAULTSIZE ) ;

   if (himage==NULL)
   {
      himage = (HICON) LoadImage( hInstance , lpIconName , IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ) ;
   }

   hb_retnl ( (LONG) himage );
}

static HWND GetStartButton(void);

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle);

HB_FUNC ( SHOWNOTIFYINFO )
{
   ShowNotifyInfo( (HWND) hb_parnl(1), (BOOL) hb_parl(2), (HICON) hb_parnl(3), (LPSTR) hb_parc(4),
         (LPSTR) hb_parc(5), (LPSTR) hb_parc(6) );
}

static void ShowNotifyInfo(HWND hWnd, BOOL bAdd, HICON hIcon, LPSTR szText, LPSTR szInfo, LPSTR szInfoTitle)
{
   NOTIFYICONDATA nid;

   ZeroMemory( &nid, sizeof(nid) );

   nid.cbSize      = sizeof(NOTIFYICONDATA);
   nid.hIcon      = hIcon;
   nid.hWnd      = hWnd;
   nid.uID         = 0;
   nid.uFlags      = NIF_INFO | NIF_TIP | NIF_ICON;
   nid.dwInfoFlags      = NIIF_INFO;

   lstrcpy( nid.szTip, TEXT(szText) );
   lstrcpy( nid.szInfo, TEXT(szInfo) );
   lstrcpy( nid.szInfoTitle, TEXT(szInfoTitle) );

   if(bAdd)
      Shell_NotifyIcon( NIM_ADD, &nid );
   else
      Shell_NotifyIcon( NIM_DELETE, &nid );

   if(hIcon)
      DestroyIcon( hIcon );
}

HB_FUNC ( SETSTARTBUTTONIMAGE )
{
   HWND hButton = GetStartButton();
   HDC  hDCButton = GetDC(hButton);
   HDC  hDcCompatibleButton;
   RECT rc;
   int  nWidth, nHeight;

   HBITMAP hBitmap, hBitmapOld;
   BITMAP bitmap;

   GetWindowRect(hButton, &rc);
   nWidth = rc.right - rc.left;
   nHeight = rc.bottom - rc.top;

   hDcCompatibleButton = CreateCompatibleDC(hDCButton);

   hBitmap = (HBITMAP)LoadImage (NULL, hb_parc(1), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

   hBitmapOld = (HBITMAP)SelectObject(hDcCompatibleButton, hBitmap);
   GetObject(hBitmap, sizeof(BITMAP), &bitmap);

   if (nWidth > bitmap.bmWidth - 3 && nWidth < bitmap.bmWidth + 3 && nHeight > bitmap.bmHeight - 3 && nHeight < bitmap.bmHeight + 3)
      BitBlt(hDCButton, 0, 0, nWidth, nHeight, hDcCompatibleButton, 0, 0, SRCCOPY);
   else
      StretchBlt(hDCButton, 0, 0, nWidth, nHeight, hDcCompatibleButton, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

   SelectObject(hDcCompatibleButton, hBitmapOld);

   DeleteDC(hDcCompatibleButton);
   DeleteDC(hDCButton);
   DeleteObject(hBitmap);
}

static HWND GetStartButton()
{
   static HWND hKnownButton=0;
   HWND hTaskBar, hButton;

   hTaskBar = FindWindow( "Shell_TrayWnd", NULL );
   hButton = GetWindow( hTaskBar, GW_CHILD );

   if (hButton)
      hKnownButton = hButton;
   else
      hButton = hKnownButton;

   return hButton;
}

HB_FUNC( GETKEYBOARDMODE )
{
   HKL kbl;
   HWND CurApp;
   DWORD idthd;
   int newmode;

   CurApp=GetForegroundWindow();
   idthd=GetWindowThreadProcessId(CurApp,NULL);
   kbl=GetKeyboardLayout(idthd);
   newmode=(int)LOWORD(kbl);
   hb_retnl(newmode);
}

#pragma ENDDUMP

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 18 Ago 2010 13:38
por clipsis
Olá, ASimoes! Obrigado pelo resposta.

Mas acho que vc não entendeu. Acontece que quando vou compilar minha aplicação cliente, está dando erro ainda na compilação.

Apresenta a mensagem: undefined reference to `HB_FUN_NETIO_FUNCEXEC'
Como se não estivesse achando a rotina

Re: Usar Servidor de DNS no NETIO

MensagemEnviado: 18 Ago 2010 13:54
por asimoes
Olá,

Você tem que incluir a lib hbnetio

[]´s

Usar Servidor de DNS no NETIO

MensagemEnviado: 20 Out 2011 11:15
por roberto-ctba
bom dia.

Estou testando a hbnetio.
Gostaria de saber o que preciso para deixar em execução no servidor para que eu conecte via remoto na base de dados.

Caso os colegas tiverem um passo-a-passo, sobre esse recurso, portas aberta no servidor, router agradeceria muito.
grato pela atenção.

Roberto
Harbour 3.0 Minigui Extended atual.

Usar Servidor de DNS no NETIO

MensagemEnviado: 28 Abr 2012 13:13
por rochinha
Amiguinhos,

Voces conseguiram alguma coisa.

Gsotariam de compartilhar. Estou na peleja e não obtive êxito ao testar hbNetIO.

Para colocar as bases em modo servidor bastará ativar o DBF Server Lights e jogar as tabelas na pasta interna DATA.

Ao testar com hbNetIO do Harbour 3.1 até revisão 17025 obtive corrupção dos data inutilizando a tabela.

Ao usar com hbNetIO do Harbour 3.1, revisão 17222 o programa trava logo na conecção e não segue em frente até que aconteça stop no DBF Server Lights.

Ao linkar apenas adicionei a hbNetIO.lib e não usei modo console.

Usar Servidor de DNS no NETIO

MensagemEnviado: 02 Mai 2017 21:03
por fladimir
ASimoes escreveu:
"Resumindo, no letodb posso usar todas as funções que ele oferece usando ip local ou dns host,
no NetIO, somente com ip local, me corrijam se eu estiver errado, pelo menos fiquei tentando descobrir por horas e nada. Falta mais documentação sobre o uso desta lib."


Sobre isto Alexandre a conclusão q vc chegou é esta mesmo então?

Usar Servidor de DNS no NETIO

MensagemEnviado: 03 Mai 2017 18:55
por asimoes
Fladimir,

Eu deixei o letodb de lado por conta daquele problema do indice, não sei se já foi resolvido, continuo usando hbnetio

Usar Servidor de DNS no NETIO

MensagemEnviado: 03 Mai 2017 19:58
por fladimir
Obrigado, só queria criar um #command pro file() pq pra ver se tem o arquivo no servidor eu teria q trocar minhas chamadas pra colocar o net:// antes e se fizer um #command facilitaria, seria isso mesmo?

Usar Servidor de DNS no NETIO

MensagemEnviado: 05 Mai 2017 10:53
por Itamar M. Lins Jr.
Ola!
Eu deixei o letodb de lado por conta daquele problema do indice, não sei se já foi resolvido,

Isso e muito mais coisas foram resolvidas usando o LetodbF(fork) do Elch.
Muito mais rápido o acesso e com todas as funções de arquivos funcionando e outras que não tem no Letodb...
O Letodbf roda 2(dois) daemons simultaneamente no servidor deixando a conexão ainda mais rápida... só alegria.
Mas para quem ainda está no xHarbour isso não funciona, melhor ir de NetIO mesmo.
'Under the hood' works now a *TWO-socket* TCP connection ( if client application is MultiThread compiled ),
enabling e,g, much faster data writes to the server.
Available is on demand an extreme fast LZ4 compress- and Blowfish-encrypt-able network traffic.
LetoDBf client lib ( used by your application ) became fully MultiThread save, each thread opens its own
connection to the server. Threads, threads threads .., wherever you look.

    + compression for LetoFileWrite() and LetoMemoWrite()
    % increase max receive block size: 0x7FFFFFFF aka 2GB - 32MB
    ; may test such big blocks handles


4.2.4 Compression LZ4 / ZLib

Default is to use highspeed realtime LZ4 compression algorithm, but stoneage BCC 5.5 compiler cannot use it !
This can be changed to classic ( slower! ) ZLib compression by outcommenting with set a < # > into first position
of the corresponding .hbp files, found at very top the line with: "#-env:__LZ4=yes"
I would very recommend lightning fast LZ4.
Re-compile both!! server executable and client library. This must fit together, a server with LZ4 won't understand
a client application with ZLib.

Additional remark: at least stoneage old BCC 5.5 had problems with using LZ4, so it is outcommented for all BCC
versions. If you want to try it with a newer BCC version you have to remove that: "{!bcc}" in the HBP files.


Essas aqui, nem tive tempo de colocar em produção/testar.
     Leto_FCopyToSrv( cLocalFileName, sServerFileName[, nStepSize ] )
                                                               ==> lSuccess
      Leto_FCopyFromSrv( cLocalFileName, sServerFileName[, nStepSize ] )
                                                               ==> lSuccess
Copy a file from/ to client to/ from server, where:
<cLocalFileName> is filename at client side,
<sServerFileName> is filename at server which can contain connection info "//IP:port/".
Optional <nStepSize> determine the size of bytes to be copied with one step, default if
not given is 1 MB.
<sServerFileName> can only contain prefix: "mem:" for files in RAM,
<cLocalFileName> can contain any redirector prefix known by Harbour.
A simple backup:
    aArr := Leto_Directory( "*" )
    AEval( aArr, { |aItem| Leto_FCopyFromSrv( aItem[1], aItem[1] } )
Copy from a logged into HbNetIO server a file to LeoDBf located in RAM:
    Leto_FCopyToSrv( "net:hbnetio.txt", "mem:RAMfile.txt" )


Saudações,
Itamar M. Lins Jr.

Usar Servidor de DNS no NETIO

MensagemEnviado: 25 Jun 2017 21:24
por JoséQuintas
Amiguinhos,
Voces conseguiram alguma coisa.
Gsotariam de compartilhar. Estou na peleja e não obtive êxito ao testar hbNetIO.
Para colocar as bases em modo servidor bastará ativar o DBF Server Lights e jogar as tabelas na pasta interna DATA.
Ao testar com hbNetIO do Harbour 3.1 até revisão 17025 obtive corrupção dos data inutilizando a tabela.
Ao usar com hbNetIO do Harbour 3.1, revisão 17222 o programa trava logo na conecção e não segue em frente até que aconteça stop no DBF Server Lights.
Ao linkar apenas adicionei a hbNetIO.lib e não usei modo console.


Não entendi direito. inventaram um hbnetio só pra minigui?

O servidor hbnetio do Harbour vém pronto.

Cheguei a usar através de no-ip, mas só pra teste, e funcionou.

Aonde estou usando, instalei há alguns anos, nem lembro mais sobre a configuração... rs
Mas com certeza, Harbouir 3.4.