Gerenciamento de Conexões

04/06/2008

4

Pessoal,

É 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.


Responder

Posts

06/06/2008

Nildo

Pessoal, É 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.


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


Responder

06/06/2008

Lucaoliveira

Ok, Vamos lá então.

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?


Responder

06/06/2008

Nildo

(desculpe, faz mto tempo que não programo em Delphi)

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


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira