Sockets. Como detectar quando estação desconecta?

Delphi

09/09/2003

Estou trabalhando com sockets e estou com porblema para verificar quando desligo da tomada uma estação. Ou seja por algum motivo, um dos micros clientes é desligado direto.

O fato é que quando uma estação é desligada, o meu servidor ainda acha que está conectado.

Como faço para fazer uma verificação nas conexões qua ainda estão ativas depois que um client for desligado?


Michele

Michele

Curtidas 0

Respostas

Aristodemo

Aristodemo

09/09/2003

ai Vareia :) ... depende de como vc esta interagido com as outras maquinas...

Uma boa alternativa genérica seria usar a pinga!

Vc pode usar um exemplo da Indy como base (PingGui)

Espero ter ajudado.

Abraços...


GOSTEI 0
Michele

Michele

09/09/2003

estou usando o delphi 6 e não posso usar ping pois trabalho com dhcp e os ips sempre variam.
O modem serve os ips.


GOSTEI 0
Pamploni Cadé

Pamploni Cadé

09/09/2003

Olá,
Fiz um Sistema para esta finalidade. Funciona da Seguinte forma:

- O Servidor possui um contador que, a cada minuto verifica quais máquinas enviaram o ping (deve-se criar um relógio no cliente para que este, quando se conectar com o Sevidor, fique enviando de minuto a minuto um ping). Este ping que estou falando é uma string do tipo ´Ping´ que é enviado através do comando ClientSocket.SendText.

- Quando passar um minuto o servidor analisa quem enviou o ´Ping´ e quem não enviou respectivamente.

- Sugestão: Guarde o ´Ping´ de cada máquina em uma grid relacionando o Nome da máquina que enviou ao evento ´Ping´. quando realizar a analise e constatar quem não enviou, poderá gerar qualquer evento.

- Se desejar poderar diminuir o tempo de contagem para a análise do ´Ping´.

- Outra coisa muito importante é que quando uma máquina se conectar, use o evento OnConnect para inserir o ´Ping´ na grid onde você estiver relacionando o envento à máquina. Poderá ter problemas se não pensar nisto pois alguma máquina poderar se conectar no meio de uma análise e assim ser desconsiderada.

Acho que é isso!! Qualquer dúvida mande-me um e-mail.

Pamploni Cadé (pamploni@bol.com.br)


GOSTEI 0
Michele

Michele

09/09/2003

Vou tentar ser explicar melhor.
Não tenho problemas para saber quantos são os micros conectados, e nem para saber quais estão conectados.
Meu problema é o seguinte:
Estou usando um serversocket1 em meu server.
Tenho 5 maquinas conectadas.
entao:

NumMaqConec:=ServerSocket1.Socket.ActiveConnections


NumMaqConec vai ser igual a 5.
Até aqui tudo bem.

Mas se alguma máquina é desligada da tomada ou resetada:
NumMaqConec:=ServerSocket1.Socket.ActiveConnections


NumMaqConec vai ser igual a 5. Ou seja continua sendo 5 e deveria ser 4.

Como é que eu faço para que o serversocket identifique que agora só tem 4 máquinas conectadas, sem ter que abrir e fechar o programa.
Tem como mandar atualizar o serversocket1?


GOSTEI 0
Vqds

Vqds

09/09/2003

Vou tentar ser explicar melhor. Não tenho problemas para saber quantos são os micros conectados, e nem para saber quais estão conectados. Meu problema é o seguinte: Estou usando um serversocket1 em meu server. Tenho 5 maquinas conectadas. entao:
NumMaqConec:=ServerSocket1.Socket.ActiveConnections
NumMaqConec vai ser igual a 5. Até aqui tudo bem. Mas se alguma máquina é desligada da tomada ou resetada:
NumMaqConec:=ServerSocket1.Socket.ActiveConnections
NumMaqConec vai ser igual a 5. Ou seja continua sendo 5 e deveria ser 4. Como é que eu faço para que o serversocket identifique que agora só tem 4 máquinas conectadas, sem ter que abrir e fechar o programa. Tem como mandar atualizar o serversocket1?


Voce pode criar no servidor uma tabela com os ips das maquina quando elas se conecta e a partir dai uar um evento TIMER para um determinado tempo de estante checar se todos os ips ainda estao respondendo.
A unica coisa que pode acontecer o voce tem que tratar e que uma maquina cliente pode responder ao ip e nao esta com a aplicacao cliente rodanto, entao voce precisa fazer com que o servidor peca alguma informacao com TRUE ou FALSE para o socket cliente.
So cuidado com o tempo que voce vai colocar pois vc pode gerar um travego muito alto na rede.


GOSTEI 0
Pamploni Cadé

Pamploni Cadé

09/09/2003

Agora entendi...

Isto ocorre porque quando a estação cliente reinicia ou perde conexão, a conexão aberta para esta estação permanece aberta no ServerSocket.

Solução: Utilize o evento OnConnect do ServerSocket para que, quando toda Estação cliente se conecte, você possa guardar a ´Handle´ da conexão (utilize o comando Socket.Handle pois este retorna a Handle da conexão que pode ser guardada num array de números inteiros). Faça uma referencia do Nome da Estação cliente com a Handle retornada para a mesma.
Quando uma estação cair. Utilize o procedimento que le enviei anteriormente e descubra qual máquina perdeu conexão. De posse de sua Handle crie um Loop com o FOR para achar a conexão que foi perdida e ainda continua aberta. Exemplo:

for x:=0 to ServerSocket.ActiveConnections-1 do
if ´handle da Estação´ = ServerSocket.Connections[x].Handle then
ServerSocket.Connections[x].close;

Pronto. Deve resolver seu problema. Qualquer coisa mande-me um e-mail.


Pamploni Cadé (pamploni@bol.com.br)


GOSTEI 0
Michele

Michele

09/09/2003

Agradeço a todos que me ajudaram, mas é o seguinte:
De certo modo eu já havia procedido da maneira que vocês estão sugerindo. Estou trabalhando com uma tabela que guarda informações de cada micro que é conectado. E com isso posso buscar informações facilmente de cada micro conectado.
Também gravo em um array uma relação de cada host, com sua respectiva conexão.

Mas não tem um jeito de o serversocket reconhecer que a conexão não está mais ativa? Em algum lugar ele deve armazenar isso.
Tem como dar uma espécie de um refresh, para o serversocket?

Desculpe a todos pela demora nas respostas, mas é que estou trabalhando nisso à noite.


GOSTEI 0
Pamploni Cadé

Pamploni Cadé

09/09/2003

Olá,

Se você abrir um console do DOS no Servidor e digitar nbtstat -a verá que para a Estação cliente que resetou existe uma conexão ativa. O ActiveConnections só será atualizado quando você fechar a conexão. Para isto deverá trabalhar com HANDLE de conexão. Se não encerrar a conexão através do comando ServerSocket.Socket.Connections[x].Close (onde x é a conexão que foi perdida). o ActiveConnections continuará a mostrar o mesmo número de conexões.
Procure guardar só o NOME DA ESTAÇÃO e a sua HANDLE de conexão.

Esqueça este negócio de Refresh pois o ServerSocket não irá detectar se a máquina resetou. Você tem que criar um mecanismo (Ping) para verificar se a máquina está respondendo. Se não responder ecerre sua conexão usando como critério sua HANDLE.

Resolvi meu problema assim. Sou Proprietário de uma Lan House com 22 máquinas e meu Sistema está estável e consegue fazer essa analise, detre outras mais.

Pamploni Cadé


GOSTEI 0
Michele

Michele

09/09/2003

Legal vou fazer assim então.
Obrigada aos que me ajudaram e vida longa a todos.


GOSTEI 0
Filipe Araújo

Filipe Araújo

09/09/2003

ServerSocket1.Socket.ActiveConnections - 1
GOSTEI 0
POSTAR