Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

Protheus :: AppServer :: Keep-Alive

Mateus disse...

“Olá Naldo, você poderia criar um post comentando sobre o funcionamento do totvsappserver e sua relação com os clients/licenças.
Por exemplo, não foi pouca as vezes que tive que reiniciar o serviço do appserver por causa de licenças "presas" no servidor (normalmente pelo "fechamento CTRL+ALT+DEL" no lado dos clients).
Por que isto ocorre ?
Abraços”

Esse não é um problema específico e exclusivo do Protheus, vários sistemas cliente/servidor que trafegam sobre TCP/IP sofrem do mesmo mal.

A questão é saber a forma como o Protheus implementa o tratamento para KeepAlive.

Normalmente o KeepAlive é tratado pelo SO, mas nada impede que de tempos em tempos o Protheus server pergunte ao cliente "ainda está aí".

Uma configuração que pode minimizar isso é a ativação do InactiveTimeOut (que nem sempre funciona e, provavelmente, não irá funcionar na eventualidade de um CTRL+ALT+DEL).

Outra questão é a inexistência da chave para o dbAccess.  Será que dbAcces também trata InactiveTimeOut? Será que quando recebe uma requisição demorada e uma ação de CTRL+ALT+DEL é tomada no cliente o dbAcces é inteligente o suficiente para interromper o processo? Acredito que não.

“A solução: Keep Alive!”

No Windows, por padrão, as mensagens para o “Keep-Alive” são de 7,200,000 milisegundos ou duas horas mas esse tempo pode ser modificado com alterações no registro.

TCP Keep-Alive Messages

A TCP keep-alive packet is simply an ACK with the sequence number set to one less than the current sequence number for the connection. A host receiving one of these ACKs responds with an ACK for the current sequence number. Keep-alives can be used to verify that the computer at the remote end of a connection is still available. TCP keep-alives can be sent once everyKeepAliveTime (defaults to 7,200,000 milliseconds or two hours) if no other data or higher-level keep-alives have been carried over the TCP connection. If there is no response to a keep-alive, it is repeated once every KeepAliveInterval seconds. KeepAliveInterval defaults to 1 second. NetBT connections, such as those used by many Microsoft networking components, send NetBIOS keep-alives more frequently, so normally no TCP keep-alives are sent on a NetBIOS connection. TCP keep-alives are disabled by default, but Windows Sockets applications can use the setsockoptfunction to enable them.”(fonte:Microsoft/TechNet)

Para Entender um pouco mais sobre “Keep-Alive” siga os links:

  1. TCP Keep-Alive Messages
  2. Using TCP keepalive to Detect Network Errors
  3. Setting the TCP keepalive timer in Windows NT, 2000 and XP
  4. Microsoft Windows 2000 TCP/IP Implementation Details

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Tcpip]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Tcpip\Parameters]
"KeepAliveTime"=dword:00000001
"KeepAliveEnable"=dword:00000001
"KeepAliveInterval"=dword:00000001

[]s
иαldσ dj

Comentários

  1. Excelent post Naldo, valeu pela resposta !

    Uma solução então, seria trabalhar em cima dos valores de registro TcpIP do Windows, por exemplo.

    Acho que o uso maior da banda por estes pacotes é um preço infimo a se pagar.

    Abraços,

    ResponderExcluir
  2. No windows 2008 R2 eu nao encontrei essa chave. Ajudaria bastante se esse problema fosse solucionado.

    ResponderExcluir
  3. KeepAliveTime
    Note
    TCP keepalives for TCP/IP for Windows Server 2008 and Windows Vista are disabled by default. If enabled through the use of the setsockopt Windows Sockets function, a keepalive segment is sent every two hours by default, as controlled by the KeepAliveTime registry value. Even if enabled, other upper-layer protocols such as NetBIOS send their own keepalive value. If the keepalive interval that the upper-layer protocol uses is less than the TCP keepalive interval, TCP keepalive value is never sent. For example, NetBIOS sessions over TCP/IP send a NetBIOS keepalive request every 60 minutes. Therefore, TCP keepalive values that are enabled for a NetBIOS session are never used.

    http://technet.microsoft.com/en-us/library/dd349797(WS.10).aspx

    ResponderExcluir
  4. Algumas Builds atuais do Protheus, tratam esta questão da conexão ficar presa, mesmo quando o usuário utiliza o subterfugio do "CTRL+ALT+DEL".
    Porém, como nosso amigo Naldo mesmo disse, ainda assim podem ocorrer problemas.
    "Não existe sistema perfeito".

    Abraços!

    Jorge Heitor

    ResponderExcluir
  5. Essa mudança no registro faço no servidor?

    ResponderExcluir
  6. Oi Naldo, deculpe desenterrar o post, seria possível uma forma de deixar um Timer no cliente que não interfira no TimeOut, fiz um timer aqui para coletar estatísticas de uso dos fontes, só que ele executa no menu principal de 30 em 30 segundos, ou seja, depois disso o inactivetimeout nunca mais derrubou nenhuma conexão... vlw pela ajuda.

    ResponderExcluir
  7. Mestre, antes de mais nada, agradeço de antemão sua cordial antenção. O appserver de 03/2020 por padrão manda o keepalive (configurado no registry e verificado pelo wireshark). Já o appserver de 10/2021 não manda, rodando este no mesmo servidor. Gostaria de perguntar se neste último é necessário habilitar através de alguma opção no appserver.ini ou se foi removido mesmo do código. O caso é que sem os keepalive packets, o appserver derruba (rst enviado para o client) precisamente em 900 segundos (15 minutos) nos casos de processos longos disparados pelo smartclient (na mesma versão que o appserver).

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA