Fórum Técnica de comunicação via Sockets(TCP/IP) HELP!!! #168125

07/07/2003

0

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

Responder

Posts

07/07/2003

Rabitz

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar