Página 1 de 2

Problemas com Servidor Windows 32 X 64

Enviado: 15 Nov 2011 11:06
por alberto_dias
Prezados Amigos, gostaria primeiramente de agradecer todos pelas ajudas que propiciaram ao logo do tempo, Obrigado, :D
Estou com o seguinte problema,
Um cliente possui 10 máquinas, um Servidor dedicado (Windows XP 32 bits) + nove estações ( metade Windows XP 32 bits, outra Windows 7 32 bits)
O sistema é (Harbour 2.0 + Bcc32 5.5.1 + Gtwvg, Banco de dados DBF + CDX ), roda normalmente, + - 300/500 pedidos por dia, não apresenta nenhum problema.
O cliente resolveu que precisa de + duas estações, como o Windows XP não suporta + que 9 Máquinas compartilhadas, providenciamos um Windows Server 2008
( 64 bits, 32 não existe mais no 2008 ) HD 500 Gb Memoria 4 GB e colocamos para funcionar, o que aconteceu,
Um dia roda normalmente, blz.
Em outro dia ele "quebra" ou melhor ignorou os índices de numeração de pedidos, começa a repetir os números de pedido, como se não houvesse índice. :-O
Foi preciso parar o sistema e reordenar os arquivos no meio do dia para poder continuar.( a loja estava lotada).
O cliente ficou uma fera, e eu nem consigo dormir direito.
Tive que infelizmente voltar o Servidor ( Windows XP 32 bits novamente), e tudo voltou ao normal.( do jeito que estava não mudei nada só voltei o Servidor)
O que eu já fiz para tentar resolver este problema:( apesar que no Windows XP 32 bits funciona normalmente)
Desabilitei o protocolo IPV6 achando que era conflito de protocolo com o IPV4( Devido ao novo Servidor 2008 64 bits + os Windows 7)
Coloquei IP fixo nas máquinas, achando que as vezes o roteador poderia falhar.( era uma tentativa de manter as máquinas na mesma rede (IP))
Testei o cabos para verificar se era problema de comunicação.(Precaução, algum poderia estar falhando)
Troquei o Switch por um novo D-Link(Novinho - Zero).(Poderia ser que uma das saidas estaria lento demais)
Troquei o Servidor novo( Coloquei outra máquina Zero Bala, instalamos novamente o 2008 Server 64 Bits, poderia ser a máquina)
E vamos lá novamente,
Ai coloquei o Servidor novo (2008 64 Bits) de novo, trabalhou dois dias normais, e ai no 3 dia, deu problema novamente. :-O
Tive de voltar o Servidor ( Windows XP 32 bits ), voltou tudo ao normal.
Esgotei as minhas idéias, fui intimado pelo cliente, ou coloco o Servidor novo para aumentar o número de estações, ou ....
Alguem tem ou teve algum problema deste tipo, alguma idéia do que poderia estar ocorrendo

Problemas com Servidor Windows 32 X 64

Enviado: 16 Nov 2011 11:37
por asimoes
Olá Alberto,

Tenta criar indices temporários para pasta temp

Problemas com Servidor Windows 32 X 64

Enviado: 16 Nov 2011 12:04
por MARCELOG
Olá companheiro,
há um bom tempo não trabalho com dbf.
Mas vamos lá...
O acesso ao sistema é realizado através de simples atalho nos terminais? Ou o executável em cada terminal acessa a base de dados?
Quando você "volta" para o servidor antigo, está utilizando os índices gerados quando estava no novo servidor ou está recriando os mesmos?
Todos os terminais executam a mesma versão do seu sistema e têm autorização de leitura e gravação no servidor?

MarceloG

Ps: Você também pode tentar isso...
http://br.answers.yahoo.com/question/in ... 839AAuz6Jz
ou isso...
http://www.aristotelesmachado.com/2010/12/retirar-limite-de-conexoes-concorrentes.html
Editado para apresentar os urls corretamente

Problemas com Servidor Windows 32 X 64

Enviado: 16 Nov 2011 21:22
por alberto_dias
Obrigado, aos companheiros pelas respostas, :D
-----------------------------
Ao companheiro Asimoes,
Eu não sei muito a respeito do que seriam índices temporários.
Como eu faria para usar índices temporários ?
O sistema continuaria rápido ?
Se houver alguma alteração de preços por exemplo, como atualizar o índice ?
-------------------------------------------------------------------------------------------
Ao companheiro MarceloG
O sistema possui uma pasta com configurações em cada estação e + um executável,
este executável acessa o Banco de Dados no Servidor.
Alguns amigos me disseram que isso criaria um grande volume de trafego na rede,
e isso poderia comprometer o Banco de Dados.
Quando voltei o servidor antigo, naturalmente eu precisei reindexar novamente os arquivos
no Servidor que voltei.
Agradeço a sua resposta, mas gostaria de perguntar a você;
Porque você não usa mais Dbfs ?
Existe mais confiabilidade em outro tipo de Banco de dados ?
Dá menos problemas do que eu tenho com Dbfs ?
Qual seria o melhor Banco na sua opinião para substituir os DBFs ?
Continuaria rápido o acesso aos dados ?
----------------------------------------------
ALBERTO DIAS :xau

Problemas com Servidor Windows 32 X 64

Enviado: 16 Nov 2011 23:08
por rosalvo rosa
Olá !!

Eu tenho um sistema harbour rodando com mais de dez maquinas, mas com servidor 2003, então não sei se posso ser util.

Mas de algumas coisas eu tenho certeza:

- arquivos temporários ??
Se o pessoal está acessando os mesmos dbfs ao mesmo tempo, não posso pensar em temporários.

- índices quebrados ??
Isso só acontece quando alguém abriu um dbf sem abrir todos os índices que esse dbf tem, ou seja,
sempre que abrir um arquivo dbf, abra todos os índices que foram criados com ele. Eu faço isso sempre
com uma função, para cada arquivo dbf, com todos os seus índices.

Outra possibilidade, seria essa máquina nova estar dando tilt no processador, ou não estar configurado para abrir mais de
N arquivos ao mesmo tempo.

Um abraço
Rosalvo

Problemas com Servidor Windows 32 X 64

Enviado: 17 Nov 2011 08:48
por Itamar M. Lins Jr.
Use o NetIO ou LetoDB, e não terá mais problemas com DBF´s
Pode usar também servidor LINUX, e as estações Windows, mesmo com NetIO ou LetoDB no servidor.
Enquanto usar mapeamento, esses problemas são normais.
Eu uso Harbour 3.1 com LetoDb, MingW.

Saudações,
Itamar M. Lins Jr.

Problemas com Servidor Windows 32 X 64

Enviado: 17 Nov 2011 10:32
por MARCELOG
Olá Alberto,
utilizo o Mysql e Sqlite em alguns projetos, sendo este último para coisas pequenas.
A minha preferência, quando o negócio é rede e o tráfico de dados é intenso, é pelo PostgreSql.
Apesar das opiniões em contrário, não acho a configuração do PostgreSql difícil, sendo que configuro o acesso remoto através dos meus sistemas, com a simples manipulação de arquivos do gerenciador de banco de dados.
Para trabalhar com esses bancos de dados você deve aprender a linguagem sql.
É muito fácil, pois ela é quase literal.
Nesse caso, para começar e entender o funcionamento das coisas recomendo o Sqlite.
Quando mudar para o Mysql ou PostgreSql vai verificar pouca diferença.
As contribuições que vem no harbour e exemplos (hbsqlite) dão uma ótima base para isso.
Com efeito, os comandos sql fazem exatamente o que dizem.
Ex: insert into X values(a,b,c,...) - insere os valores a,b,c,... na tabela X
Há vários (e bons) tutoriais na internet.
O resto vai depender somente de você e da sua criatividade.

MarceloG

Ps: Deixei de usar dbf por causa da necessidade de acesso remoto. Achei melhor usar o gerenciador de banco de dados (MySql, Sqlite e PostgreSql) direto, com as contribuições do harbour/xharbour.
Considerando a forma de acesso, tráfico e volume de dados é tudo muito rápido.
Quando usava dbf com índices cdx, o executável e demais arquivos ficavam no servidor. Eu apenas criava um atalho nos terminais e pronto, nunca tive problemas.
Ainda...
No seu caso, experimente usar os índices que vieram do servidor novo.
Provavelmente estarão corrompidos.
Isso pode ocorrer pelos mais diversos fatores, mas também pode ser o óbvio: algum terminal não está autorizado a ler/gravar no servidor sem gerar aviso para o usuário.

Problemas com Servidor Windows 32 X 64

Enviado: 20 Nov 2011 12:46
por asimoes
NetIO é uma opção fácil de implementar.
Eu uso sem problemas.

Problemas com Servidor Windows 32 X 64

Enviado: 22 Nov 2011 23:56
por lucimauro
assimoes vceo tem algum exemplo com o netio?

Problemas com Servidor Windows 32 X 64

Enviado: 23 Nov 2011 10:11
por asimoes
Ola Lucio,

Para iniciar com netio, estou postando este exemplo que eu uso:

Exemplo com netio:

Se você não tem o harbour 3.1 e hwgui, baixe desse endereço:

http://www.4shared.com/file/JogQfY4s/hb31.html

No meu exemplo o sistema servidor foi compilado com harbour (3.1) + hwgui(svn) + mingw(32)
bat para compilar o servidor:

Código: Selecionar todos

@echo off
SET PATH=%PATH%;D:\HB31\BIN
SET hb_compiler=mingw
hbmk2 servidor.hbm -rebuild 
pause
servidor.hbm

Código: Selecionar todos

# ---------------------------
# Nome do Executável
# ---------------------------
-oservidor
# ---------------------------
# Bibliotecas
# ---------------------------
-lhbct
-lhwgui
-lprocmisc
-lhbxml
-lhwg_qhtm
-lhbnetio
-lhbtip
-lxhb
# ---------------------------
# Caminhos dos Includes
# ---------------------------
-incpath=d:\hb31\hwgui\include
# ---------------------------
# Caminho das Libs 
# ---------------------------
#-Ld:\harbourx\hwgui\lib
-Ld:\hb31\hwgui\lib
# ---------------------------
# Outros Parâmetros
# ---------------------------
-workdir=.\OBJ\
-head=full
-gtgui
-n
-nowarn
-inc
-mt
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
servidor
servidor.rc
# ---------------------------
# Fim
# ---------------------------
(*)Faça as modificações que achar necessárias. O servidor.exe deve ser executado na inicialização do windows.

Exemplo de chamada:

Código: Selecionar todos

IF !AbreDBF("SEUDBF")
   DbCloseAll()
   RETURN Nil
ENDIF
FUNÇÃO AbreDBF

Código: Selecionar todos

#include "common.ch"
#include "DbStruct.ch"
FUNCTION AbreDBF(cDataBase,lShared)
LOCAL nArea, cServer:=cServidorDB, lOk:=.T.
DEFAULT lShared TO .T.
//  Abre o Arquivo necessario na rotina.
IF Alias() = Upper(cDataBase)
   DbSelectArea(cDataBase)
   RETURN .T.
ENDIF
FOR nArea:=0 To 150
   IF !Empty((nArea)->(Alias()))
      If RTrim((nArea)->(Alias())) = Upper(cDataBase)
         DbSelectArea(cDataBase)
         RETURN .T.
      ENDIF
   ENDIF
NEXT
DO CASE
CASE UPPER(cDataBase) = 'SEUDBF'
   IF !Netio_FuncExec("EXISTE","SEUDBF.CDX")
      NetUse(cServer,cDataBase,.T.) 
      INDEX ON CODIGO TAG SEUDBF
      SEUDBF->(DbCloseArea()) 
   ENDIF
   lOk:=NetUse(cServer,cDataBase,lShared)
   SET INDEX TO (cServer+"SEUDBF.CDX")
ENDCASE
RETURN lOk

FUNCTION NetUse(cServer,cDatabase,lOpenMode,nSeconds,cRDD)
LOCAL lForever, cDirTab:="", lOk:=.F.

DEFAULT lOpenMode TO .F.,;
        nSeconds  TO 0,;
        cRDD      TO "DBFCDX",;
        cServer   TO ""

lForever := (nSeconds = 0)
DO WHILE (lForever .Or. nSeconds > 0)
   IF lOpenMode
      DbUseArea(.T.,cRDD,cServer+cDataBase,cDataBase,.T.)
   ELSE
      DbUseArea(.T.,cRDD,cServer+cDataBase,cDataBase,.F.)
   ENDIF
   IF ! NetErr()                    // Use succeeds
      lOk:=.T. 
      EXIT
   ENDIF
   Inkey(1)         // Wait 1 second
   nSeconds--
ENDDO
RETURN lOk
NO MÓDULO QUE INICIALIZA O SISTEMA

Código: Selecionar todos

INIT FUNCTION AppSetup()
  LOCAL  hWrite:=Hash(), hRead:=HB_ReadIni( "CONFIG.INI" )
  LOCAL  nVezes
  PUBLIC cServidorDB, cIpAddServer:=Obter_Ip_Maquina("servidor"), cPortaServer:="2813"
  REQUEST HB_LANG_PT
  REQUEST HB_CODEPAGE_PT850
  HB_LANGSELECT("PT")
  HB_CDPSELECT( "PT850" )
  SETMODE(25,80)
  SET TYPEAHEAD TO 0
  SET INTENSITY ON
  SET SCOREBOARD OFF
  SET DELETED ON
  SET SAFETY OFF
  SET DATE ANSI
  SET ESCAPE ON
  SET CENTURY ON
  SET DELIMITERS TO
  SET EXCLUSIVE OFF
  SET WRAP ON
  SET EPOCH TO 1920
  SET OPTIMIZE ON
  SET DBFLOCKSCHEME TO DB_DBFLOCK_DEFAULT 
  SET MESSAGE TO 24 CENTER
  IF !File("CONFIG.INI")
     hWrite["MAIN" ]           := Hash()
     hWrite["MAIN" ]["Desc" ]  := "Sistema Exemplo"
     hWrite["MAIN" ]["Ver"  ]  := "Versao 1.0a"
     hWrite["CONFIGURACAO" ]             := Hash()
     hWrite["CONFIGURACAO" ]["Porta"]    := cPortaServer
     hWrite["CONFIGURACAO" ]["IPAddress"]:= cIpAddServer
     HB_WriteIni( "CONFIG.INI", hWrite,"--- Inicio ---", "--- Fim ---" )
  ELSE
     cPortaServer:=hRead["CONFIGURACAO"]["Porta"]
     cIpAddServer:=hRead["CONFIGURACAO"]["IPAddress"]
  ENDIF 
  //cIpAddrServer:="ipdns.dyndns.org"
  cServidorDB:='net://'+cIpAddServer+':'+cPortaServer+':db'+HB_OSpathseparator()  
  nVezes:=0 
  DO WHILE !NetIO_Connect(cIpAddServer,Val(cPortaServer),1500,"senha")
     IF nVezes > 30
        Info("NÆo foi poss¡vel conectar ao servidor: "+cServidorDB+HB_OsNewLine()+;
             "Encerrando o sistema!" )
        DbCLoseAll()
        ExitProcess()
     ENDIF
     nVezes++
     IF nVezes >= 2  .AND. nVezes <= 15
        cIpAddServer:=Obter_Ip_Maquina("servidor") //Verifica_Ip()
     ELSEIF nVezes > 15
        cIpAddServer:=Verifica_Ip()
     ENDIF
  ENDDO
  cServidorDB:='net://'+cIpAddServer+':'+cPortaServer+':db'+HB_OSpathseparator()  
  IF nVezes > 1
     hWrite["MAIN" ]           := Hash()
     hWrite["MAIN" ]["Desc" ]  := "Sistema Exemplo"
     hWrite["MAIN" ]["Ver"  ]  := "Versao 1.0a"
     hWrite["CONFIGURACAO" ]             := Hash()
     hWrite["CONFIGURACAO" ]["Porta"]    := cPortaServer
     hWrite["CONFIGURACAO" ]["IPAddress"]:= cIpAddServer
     HB_WriteIni( "CONFIG.INI", hWrite,"--- Inicio ---", "--- Fim ---" )
  ENDIF
RETURN Nil 

FUNCTION Obter_Ip_Maquina(cMaquina)
LOCAL aHosts:={}
HB_InetInit()
aHosts := HB_InetGetHosts( cMaquina )
IF aHosts == NIL
   aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
IF Empty(aHosts)
   aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
HB_InetCleanup()
RETURN IF(Len(aHosts)>0,aHosts[1],"")
(*)Servidor.prg

Código: Selecionar todos

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

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

LOCAL   oTrayMenu 
LOCAL   nTentativa:=1
PRIVATE cFileLog:="SERVIDOR.LOG"
PRIVATE oIconIni:=HIcon():AddResource("ICON_2")
PRIVATE hWrite:=Hash(), hRead:=HB_ReadIni( "NETIOSERVER.INI" )
PRIVATE cFileIni:= "NETIOSERVER.INI"
PRIVATE cCaminhoSepara:=HB_OSpathseparator()
PRIVATE pListenSocket, c_Port:="2813", c_Path:=cCaminhoSepara+"DB", c_Addr:=Verifica_Ip(), c_SRVN:=""
PRIVATE nIcon      :=Nil
PRIVATE CRLF       :=HB_OsNewLine()

PRIVATE oIcon1     :=HIcon():AddResource("ICON_1")
PRIVATE oIcon2     :=HIcon():AddResource("ICON_2")
PRIVATE oMainWindow:=Nil
PRIVATE oTimer     :=Nil
PRIVATE nIcon      :=Nil

*REQUEST __HB_EXTERN__ //Adiciona todas as funções do harbour.


   IF !File(cFileIni)
      hWrite["MAIN" ]           := Hash()
      hWrite["MAIN" ]["Desc" ]  := "Servidor - NetIO - 2011"
      hWrite["MAIN" ]["Ver"  ]  := "Versao 2.0"
      hWrite["CONFIGURACAO" ]             := Hash()
      hWrite["CONFIGURACAO" ]["Port"]     := c_Port
      hWrite["CONFIGURACAO" ]["Path"]     := c_Path
      hWrite["CONFIGURACAO" ]["Addres"]   := c_Addr
      hWrite["CONFIGURACAO" ]["Servidor"] := c_SRVN
      HB_WriteIni( cFileIni, hWrite,"--- Inicio ---", "--- Fim ---" )
   ELSE
      c_Port:=hRead["CONFIGURACAO"]["Port"]
      c_Path:=hRead["CONFIGURACAO"]["Path"]
      c_Addr:=hRead["CONFIGURACAO"]["Addres"]
      c_SRVN:=hRead["CONFIGURACAO"]["Servidor"]
   ENDIF 

   pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha") 
   NetIO_Listen( Val(c_Port),c_Addr) 
   //IF Empty(pListenSocket)
   //   Liberar()
   //ENDIF
   //NETIO_MTSERVER( [<nPort>], [<cIfAddr>], [<cRootDir>], [<lRPC>],[<cPasswd>], [<nCompressionLevel>], [<nStrategy>] )

   DO WHILE Empty(pListenSocket)
      IF nTentativa > 3
         MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port+" ou já está em uso.")
         Liberar()
      ENDIF
      c_Addr:=Verifica_Ip()
      //c_Port:=LTrim(Str(Val(c_Port)+1))
      pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha") 
      nTentativa++
   ENDDO 

   IF c_Addr <> Verifica_Ip()
      AtualizaIni()
   ENDIF

   cServidorDB:='//'+c_Addr+':'+c_Port+'/'
   
   INIT WINDOW oMainWindow MAIN TITLE "Servidor NetIO - "+cServidorDB
   
   CONTEXT MENU oTrayMenu
      MENUITEM "Parar o Servidor"      ACTION PararServidor()
      MENUITEM "Reiniciar o Servidor"  ACTION IniciarServidor()
      MENUITEM "Testar IP"             ACTION {||c_Addr:="127.0.0.1"}
      MENUITEM "Sobre"                 ACTION MsgInfo("Servidor NetIO"+CRLF+;
                                                      "Desenvolvido por Alexandre Simões"+CRLF+;
                                                      "asimoesluz@gmail.com")
      SEPARATOR
      MENUITEM "Sair"                  ACTION Sair()
   ENDMENU
   
   Liga_Timer(oMainWindow,.T.)

   //ShowNotifyInfo( oMainWindow:handle, .T. , oIconIni:handle, NIL,"Servidor NetIO Iniciado","Sistema Exemplo")

   GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO INICIADO")
   
   oMainWindow:InitTray( oIconIni,,oTrayMenu,"Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() )
   
   //ShowNotifyInfo( GetModalHandle() , .T. , "Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() , NIL, "Servidor NetIO Iniciado","Harbour - NetIO" )
   //ShowNotifyInfo( GetModalHandle(1) , .T. , "Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir() , NIL, "Servidor NetIO Iniciado","Harbour - NetIO" )
  
   ACTIVATE WINDOW oMainWindow NOSHOW
   oTrayMenu:End()
	   
RETURN Nil

FUNCTION MudaIcone   
MEMVAR oMainWindow
MEMVAR oIcon1
MEMVAR oIcon2
   Liga_Timer(oMainWindow,.F.)
   IF c_Addr <> Verifica_Ip()
      GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO PARADO POR TROCA DE IP "+c_Addr)
      c_Addr:=Verifica_Ip()
      PararServidor()
      pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha") 
      GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO REINICIADO COM IP "+c_Addr)
      AtualizaIni()
      cServidorDB:='//'+c_Addr+':'+c_Port+'/'
   ENDIF   
   IF ValType(nIcon) == "U"
      //ShowNotifyInfo( _HMG_aFormhandles[i], .T. , LoadTrayIcon( GetInstance(), _HMG_aFormNotifyIconName[i] ), _HMG_aFormNotifyIconToolTip[i], cMessage, cTitle )
      //ShowNotifyInfo( oMainWindow:handle, .F. , NIL, NIL, NIL, NIL )
      //ShowNotifyInfo( oMainWindow:handle, .T. , oIcon2:handle, "teste 1", "teste 2", "teste 3" )
      //ShowNotifyInfo( oMainWindow:handle, .T. , oIcon2:handle, "","TESTE",)
      nIcon:=1
   ENDIF
   nIcon := IF(nIcon > 2, 1, nIcon)
   Muda_Icone(IF(nIcon=1,oIcon1,oIcon2),"Servidor NetIO (r2011-05) - "+c_SRVN+CRLF+cServidorDB+":"+cCaminhoSepara+CurDir())
   nIcon++
   Liga_Timer(oMainWindow,.T.)
RETURN Nil

FUNCTION GravaLog(cFile,cEvento)
   StrFile(cEvento+CRLF,cFile,.T.)
RETURN NIl

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

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

FUNCTION Sair
MEMVAR oMainWindow
   Liga_Timer(oMainWindow,.F.)   
   oMainWindow:oTimer:End()   
   //IF MsgNoYes("Encerrar o servidor ?","Aviso do Sistema")
      PararServidor(.T.)
      ShowNotifyInfo( oMainWindow:handle, .F. , NIL, NIL, NIL, NIL )
      Liberar()
   //ELSE
   //   Liga_Timer(oMainWindow,.T.)
   //   RETURN Nil
   //ENDIF
RETURN Nil

FUNCTION Liberar
   EndWindow()  
   ExitProcess()
RETURN Nil

FUNCTION PararServidor(lSaida)
MEMVAR pListenSocket
DEFAULT lSaida TO .F.
   IF !Empty( pListenSocket )
      NetIO_ServerStop( pListenSocket )
      pListenSocket := NIL
      GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO PARADO"+IF(lSaida," (SAIDA)",""))
   ENDIF
RETURN Nil

FUNCTION IniciarServidor
LOCAL nTentativa:=1
MEMVAR pListenSocket
   IF Empty(pListenSocket)
      PararServidor()
      pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha") 
      DO WHILE Empty(pListenSocket)
         IF nTentativa > 10
            GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": ERRO NA INICIALIZACAO DO SERVIDOR NETIO")
            MsgInfo( "Servidor não pode ser inicializado em "+c_Addr+":"+c_Port)
            EndWindow()
         ENDIF
         c_Addr:=Verifica_Ip()
         c_Port:=LTrim(Str(Val(c_Port)+1))
         pListenSocket := NetIO_mtServer( Val(c_Port),c_Addr,,.T.,"senha") 
         nTentativa++
      ENDDO
      IF c_Addr <> Verifica_Ip()
         AtualizaIni()
      ENDIF
      cServidorDB:='//'+c_Addr+':'+c_Port+'/'
      GravaLog(cFileLog,HB_DTOC(Date(),"DD/MM/YYYY")+" "+Time()+": SERVIDOR NETIO REINICIADO")
      //MsgInfo( "Servidor foi inicializado em "+c_Addr+":"+c_Port)
   ENDIF
RETURN Nil

//FUNCTION Verifica(pSocket)
//MEMVAR pListenSocket
//   DO WHILE !EMPTY( pSocket )
//      ThreadSleep( 1000 )
//	 ENDDO
//RETURN .T.

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 Obter_Ip_Maquina(cMaquina)
LOCAL aHosts:={}
HB_InetInit()
aHosts := HB_InetGetHosts( cMaquina )
IF aHosts == NIL
   aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
IF Empty(aHosts)
   aHosts:=HB_InetGetAlias( cMaquina )
ENDIF
HB_InetCleanup()
RETURN IF(Len(aHosts)>0,aHosts[1],"")

FUNCTION AtualizaIni

   hWrite["MAIN" ]           := Hash()
   hWrite["MAIN" ]["Desc" ]  := "Servidor - NetIO - 2011"
   hWrite["MAIN" ]["Ver"  ]  := "Versao 2.0"
   hWrite["CONFIGURACAO" ]             := Hash()
   hWrite["CONFIGURACAO" ]["Port"]     := c_Port
   hWrite["CONFIGURACAO" ]["Path"]     := c_Path
   hWrite["CONFIGURACAO" ]["Addres"]   := c_Addr
   hWrite["CONFIGURACAO" ]["Servidor"] := c_SRVN
   HB_WriteIni( cFileIni, hWrite,"--- Inicio ---", "--- Fim ---" )
 
RETURN Nil

FUNCTION EXISTE(cIndice)
LOCAL lExiste
   lExiste:=File("DB"+HB_OSPathSeparator()+cIndice)
RETURN lExiste

FUNCTION APAGAINDICE(cIndice)
LOCAL lOk:=.T.
   FileDelete("DB"+HB_OSPathSeparator()+cIndice)
RETURN lOk

FUNCTION LIMPARTEMP(cArq,nDias)
LOCAL cFile, lOk:=.T.
DEFAULT nDias TO 10
cFile := FileSeek("DB"+HB_OSPathSeparator()+cArq)
DO WHILE !Empty(cFile)
   IF FileDate() <= Date() - nDias
      IF File("DB"+HB_OSPathSeparator()+cFile)
         FileDelete("DB"+HB_OSPathSeparator()+cFile)
      ENDIF
   ENDIF
   cFile:=FileSeek()
ENDDO
RETURN lOk

FUNCTION SYS( cExtensao, Ini )
LOCAL cDbfDbf,;
      cData,;
      TmpHandle
DEFAULT Ini       TO "XT",;
        cExtensao TO ""
cData   := StrZero(HB_Random(999999),6) 
cDbfDbf := "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
DO WHILE .T.
   cFile := FileSeek(cDbfDbf)
   lExiste:=.F.
   DO WHILE !Empty(cFile)
      cData  := StrZero(HB_Random(999999),6) 
      cDbfDbf:= "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
      lExiste:=.T.
      cFile := FileSeek()
   ENDDO
   IF !lExiste
      TmpHandle := FCreate(cDbfDbf)
      IF TmpHandle # - 1
         IF FClose(TmpHandle)
            EXIT
         ENDIF
      ENDIF
   ENDIF
ENDDO
RETURN (cDbfDbf)

FUNCTION SYS2( cExtensao, Ini )
LOCAL cDbfDbf,;
      cData,;
      TmpHandle
DEFAULT Ini       TO "XT",;
        cExtensao TO ""
cData   := StrZero(HB_Random(999999),6) 
cDbfDbf := "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
DO WHILE .T.
   cFile  := FileSeek(cDbfDbf)
   lExiste:=.F.
   DO WHILE !Empty(cFile)
      cData  := StrZero(HB_Random(999999),6) 
      cDbfDbf:= "DB"+HB_OSPathSeparator()+Ini+cData+cExtensao
      lExiste:=.T.
      cFile := FileSeek()
   ENDDO
   IF !lExiste
      TmpHandle := FCreate(cDbfDbf)
      IF TmpHandle # - 1
         IF FClose(TmpHandle)
            EXIT
         ENDIF
      ENDIF
   ENDIF
ENDDO
RETURN (Ini+cData)

FUNCTION SYSTXT( cExtensao )
LOCAL cTxtTxt,;
      cData,;
      nTmpHandle
cData  := StrZero(HB_Random(999999),6) 
cTxtTxt:= "DB"+HB_OSPathSeparator()+"TX"+cData+cExtensao
DO WHILE .T.
   cFile  := FileSeek(cTxtTxt)
   lExiste:=.F.
   DO WHILE !Empty(cFile)
      cData  :=StrZero(HB_Random(999999),6) 
      cTxtTxt:="DB"+HB_OSPathSeparator()+"TX"+cData+cExtensao
      lExiste:=.T.
      cFile  :=FileSeek()
   ENDDO
   IF !lExiste
      nTmpHandle := FCreate(cTxtTxt)
      IF nTmpHandle # - 1
         IF FClose(nTmpHandle)
            EXIT
         ENDIF
      ENDIF
   ENDIF
ENDDO
RETURN (cTxtTxt)

FUNCTION CRIAETIQUETA(cDataBase)
LOCAL lOk:=.T., aStru:={}
IF !File("DB"+HB_OSPathSeparator()+cDataBase)
   AADD(aStru,{"C1","C",57,0})
   AADD(aStru,{"C2","C",57,0})
   AADD(aStru,{"C3","C",57,0})
   DbCreate("DB"+HB_OSPathSeparator()+cDataBase,aStru)
   lOk:=File("DB"+HB_OSPathSeparator()+cDataBase)
ENDIF
RETURN lOk

FUNCTION CRIATEMP(aStruTemp)
LOCAL cArqTemp:=STRTRAN(SYS2(".DBF"),".DBF")

   DbCreate("DB"+HB_OSPathSeparator()+cArqTemp,aStruTemp,"DBFCDX")
   
RETURN cArqTemp

INIT FUNCTION Config
   REQUEST HB_LANG_PT
   REQUEST HB_CODEPAGE_PT850
   HB_LANGSELECT("PT")
   HB_CDPSELECT( "PT850" )
   SET DATE BRITI
   SET CENTURY ON
   SET OPTIMIZE ON
   REQUEST HB_DATETIME
   REQUEST DBFCDX
   RddSetDefault("DBFCDX")
RETURN Nil


/*#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"
#define WINVER    0x0500
#define WM_TASKBAR   WM_USER + 1043
#define WM_NOTIFYICON   WM_USER+1000
#define  ID_NOTIFYICON   1

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;
  nid.uCallbackMessage = WM_TASKBAR;
	
	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_MODIFY, &nid );

	if(hIcon)
		DestroyIcon( hIcon );
} 

#pragma ENDDUMP */

#pragma BEGINDUMP

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

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 );
}

#pragma ENDDUMP




/*#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_MODIFY, &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 */

Problemas com Servidor Windows 32 X 64

Enviado: 23 Nov 2011 11:53
por Itamar M. Lins Jr.
Agradeço por compartilhar seu código.
Porém acredito ser melhor colocar em um arquivo na area de download com os icones.
Outra questão é se, é possível rodar o NetIO via ADSL ?

Saudações,
Itamar M. Lins Jr.

Problemas com Servidor Windows 32 X 64

Enviado: 23 Nov 2011 15:34
por asimoes
Itamar,

Fiz isso as pressas, mas vou preparar um pacote zipado com essas dicas e arquivos envolvidos.
O que você quer dizer com ADSL?
[]´s

Problemas com Servidor Windows 32 X 64

Enviado: 24 Nov 2011 00:17
por marcos.gurupi
Caro Adalberto td indica que existe um problema no sistema operacional do servidor ou mesmo no hardware. Teoricamente nao eh problema seu, mas nos sabemos como funciona. Se vc chamar alguem pra ver o hardware/rede ele vai acabar falando q eh o sistema. :)

Entaum eu sugiro que vc instale o win2003 server no servidor (novo). Tenho quase certeza q vai rodar.

Marcos Roberto.

Problemas com Servidor Windows 32 X 64

Enviado: 30 Nov 2011 09:14
por Itamar M. Lins Jr.
O que você quer dizer com ADSL?
Linha discada, da velox por exemplo, temos que usar ddns...

Saudações,
Itamar M. Lins Jr.

Problemas com Servidor Windows 32 X 64

Enviado: 30 Nov 2011 09:19
por asimoes
Para acesso remoto por um servidor de dns o letodb é melhor.
Itamar M. Lins Jr. escreveu:Linha discada, da velox por exemplo, temos que usar ddns...