Sockets. Como detectar quando estação desconecta?
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?
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
Curtidas 0
Respostas
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...
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
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.
O modem serve os ips.
GOSTEI 0
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)
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
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 vai ser igual a 5.
Até aqui tudo bem.
Mas se alguma máquina é desligada da tomada ou resetada:
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?
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
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 vai ser igual a 5.
Até aqui tudo bem.
Mas se alguma máquina é desligada da tomada ou resetada:
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?
NumMaqConec:=ServerSocket1.Socket.ActiveConnections
NumMaqConec:=ServerSocket1.Socket.ActiveConnections
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é
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)
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
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.
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é
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é
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
09/09/2003
Legal vou fazer assim então.
Obrigada aos que me ajudaram e vida longa a todos.
Obrigada aos que me ajudaram e vida longa a todos.
GOSTEI 0
Filipe Araújo
09/09/2003
ServerSocket1.Socket.ActiveConnections - 1
GOSTEI 0