Técnica de comunicação via Sockets(TCP/IP) HELP!!!
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
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
Curtidas 0
Respostas
Ramerhy
05/07/2003
Uma solução para o seu problema seria o servidor guardar o endereço ip da aplicação cliente e de tempos em tempos a aplicação servidora enviar um ´ping´ para o aplicativo cliente utilizando o endereço IP. Caso não tenha resposta do cliente, ele pode entender que a conexão não está mais estabelecida e encerrar o cliente que solicitou a conexão...
É uma idéia...
É uma idéia...
GOSTEI 0
Sanwilly
05/07/2003
Caro amigo, tive o mesmo problema e resolvi assim...
Ponha um componente Timer e no evento ontimer faça o seguinte:
label1.caption := ´Conexões ativas: ´ + inttoStr(server.socket.activeconections);
com isso eu resolvi o problema pois de segundo em segundo as conexoes ativas sao atualizadas pelo evento ontimer do componente timer..
espero ter ajudado.
Eduardo -- Brasilia DF
Ponha um componente Timer e no evento ontimer faça o seguinte:
label1.caption := ´Conexões ativas: ´ + inttoStr(server.socket.activeconections);
com isso eu resolvi o problema pois de segundo em segundo as conexoes ativas sao atualizadas pelo evento ontimer do componente timer..
espero ter ajudado.
Eduardo -- Brasilia DF
GOSTEI 0