Técnica de comunicação via Sockets(TCP/IP) HELP!!!

Delphi

07/07/2003

Olá, estou com um enorme problema. Estou fazendo um programa para lanhouses e estou usando como um interceptador de comunicação os componentes TClientSockete o TServerSocket. A comunicação está funcionando muito bem, mas o meu problema específico é o seguinte:

Se por um acaso o computador(cliente), que está conectado, for desligado(quando eu digo desligar, é estar desligando diretamente do botão ou então resetando a máquina através do botão Reboot do PC), o que acontece é que o servidor não perde a conexão, ou melhor, ele pensa que está conectado. Ele não consegue se atualizar.

Por exemplo: Tenho uma função que me retorna se o Cliente está conectado ao servidor. Como passagem de parâmetro por cópia(ou referencia) eu passo apenas o host, e a função, procura dentro da lista de conexões o host e retorna se ele está conectado, sim(TRUE) ou não(FALSE);


function EncontraHOST(HOST : String) : Boolean;
var
TOTCon : Integer; //total de conectados
I : Integer; //apenas um contador
begin
//recebe o total de conectados no Servidor
TOTCon := FrmPrincipal.Servidor.Socket.ActiveConnections;
//Deixo o resultado como falso, informando que o Host não foi encontrado
Result := False;
//se TOTCon = 0 então não tem ninguem conectado
if TOTCon = 0 then
Result := False
else
// se for somente um, então verifica se este único cliente é o host que estou procurando
if TOTCon = 1 then
begin
//se o Host que está na lista de conexoes do índice 0(primeira conexa) for igual ao host que eu estou procurando, então o cliente está conectado.
Tá, mas aqui está o problema, se a maquina for rebootada ou desligada sem terminar a conexao, o servidor pensa que ainda tem alguem conetado, mas na real, não está, então na hora que o server vai tentar pegar o nome no host com o seguinte a seguinte conexao (if FrmPrincipal.Servidor.Socket.Connections[0].RemoteHost=HOST then
), acontece um lag de mais ou menos 15 segundos no meu programa, ou praticamente, ele trava. Agora, quando a maquina cliente que foi desligada/rebootada for ligada novamente e entrar no windows, o Servidor(TServerSocket) consegue reconhecer que perdeu a conexao, daí então o programa volta a funcionar novamente.}
if FrmPrincipal.Servidor.Socket.Connections[0].RemoteHost=HOST then
begin
Result := True;
Exit;
end;
end
else
if TOTCon > 0 then
for i := 0 to TOTCon-1 do
if FrmPrincipal.Servidor.Socket.Connections[i].RemoteHost=HOSTthen
begin
Result := True;
Break;
end;
end;

Bom... tomara que tenham intendido a minha dúvida..
Resumindo, existe uma maneira de atualizar a lista de clientes conectados?

Um forte abraço...


Atenciosamente, NetCrusher


Netcrusher

Netcrusher

Curtidas 0

Respostas

Rabitz

Rabitz

07/07/2003

na verdade eu ainda não entendi como trabalhar com HOST...


acredito que se você trabalhar com IPs ficaria mais fácil...

assim, mandaria um PING de tempos em tempos para o cliente, e caso não retorne nada, retira ele da lista de clientes conectados.

e ao aceitar uma conexão, faz com que o cliente entre na lista de clientes conectados.

acho que não tem mistério

[]´s Rabitz


GOSTEI 0
POSTAR