Gerenciamento de Conexões
04/06/2008
0
É o seguinte. desenvolvi um software utilizando TServerSocket da paleta Internet do Delphi 6.0. O software que é um serviço do windows está funcionando corretamente a não ser por um detalhe está travando tendo que ser reiniciado a cada 15 minutos(faço isso pelas tarefas agendadas). Bom, o caso é que eu verifiquei que o lado client da aplicação que é um GPRS (que depois é convertido em TCP/IP) fica caindo de maneira anormal. Em testes locais qdo eu desconecto o client propositalmente o server gerencia isso de forma lega, inclusive tirando a conexão do windows(verifiquei através do netsat -n). O problema é qdo o client termina de forma anormal, o server não percebe e não retira a conexão do ar, fica a conexão pendurada no windows até reiniciar o software(serviço).
Eu gostaria de saber duas coisas se possível:
- tem como de tempos em tempos mandar limpar conexões pendentes;
- temo como saber o número da conexão, hj só sei se der um netstat -n pelo prompt;
Grato.
Lucaoliveira
Posts
06/06/2008
Nildo
O problema das conexões mortas, você resolve com um esquema de PING. Pingou? Deixa lá. Não pingou? Fecha a conexão pelo server. Assim você limpa as conexões inativas.
Quanto ao problema de ter que reiniciar, verifique o consumo de memória e de conexões simultaneas. As vezes você está instanciando objetos e esquecendo na memória, perdidas, o que faz consumir muita memória até explodir o serviço.
Abraços
06/06/2008
Lucaoliveira
Eu tenho aproximadamente 600 conexões simultâneas qdo vc fala em dar um Ping, vc está sugerindo criar uma rotina para ping todas a conexões simultâneas? E como eu faço para desconectar uma conexão pendente através do server?
Qto ao travamento venho monitorando o serviço e percebo que a qtdade alocada não é tão grande o que me parece(isso é um chute) é que as conexões inativas acabam atrapalhando as novas conexões. Eu creio que se eu descobrir uma maneira de limpar as conexões pendentes via delphi de tempos em tempos talvez resolva o problema.
O que vc acha?
06/06/2008
Nildo
Faça o seguinte então, a cada N segundos vc faz um
for de 0 a length( ServerSocket.connections ), e manda um Ping para o Socket do retorno da conexao atual do FOR. Nesse Ping vc manda um texto ´Ping´ por exemplo, e faz o client responder um ´Pong´ quando receber. Se o servidor não receber esse ´Pong´ você da um ServerSocket.Connections[ i ].Close, ou algum comando assim pq não lembro de cabeça
Clique aqui para fazer login e interagir na Comunidade :)