desconexão de sokets

12/07/2004

0

Olá pessoal...

Fiz a procedure abaixo para detectar quandoum clietesocket se desconecta do server, porém está ocorrendo um erro. No servidor, coloquei uma estrutura assim:

 

type 
PCliente = ^TCliente; 
TCliente = record 
Nick: String[30]; 
Socket: TCustomWinSocket; 
Texto: String; 
cod : string; 
tempo : string; 
pi : string;


onde armazeno os dados dos clientes que se conectam ao sistema. A estrutura recebe em pi o valor ´PING´, no evento on conect do serversocket. Tenho tb um timer que de 30 em 30 segundos dispara a verificação:

var 
i : integer; 
Cliente : PCliente; 
begin 
timer2.Enabled:=false; 
with servidor.Socket do 
  begin 
  for i:=0 to activeConnections -1 do 
  if Connections[i].Connected then 
  begin 
  Cliente:=Connections[i].data; 
  if Cliente^.pi <> ´PING´ then 
    begin 
    dispose(cliente); 
    cliente^.Socket.Data:=nil; 
    end; 
   end; 
  end; 
  with servidor.Socket do 
  begin 
  for i:=0 to activeConnections -1 do 
  if Connections[i].Connected then 
    begin 
    Cliente^.pi:=´´; 
    cliente^.Socket.SendText(´PONG´); 
    end; 
  end; 
  timer2.Enabled:=true; 
end; 


no primeiro bloco faço um loop em todas as conexões ativas para ver se alguma delas está com o valor diferente de ping, e se tiver libero a conexão. Já no segundo bloco faço novamente um loop de todas as conexões que continuam ativas e apago o valor de cliente^.pi e logo em seguida envio a todos o comando ´PONG´ que ao chegar ao cliente retorna novamente o valor ping a minha estrutura. Até aqui tudo bem na proxima vereficação o cliente que não responder será desconectado, o problema é que depois de alguns minutos rodando, gera uma access violation, e não consegui debugar pra saber de onde é pois na máquina que desenvolvi funcionou, gerou erro quando estava com várias máquinas conectadas.

Alguem tem idéia do que pode estar errado, pois eu não consegui encontrar o problema.
Grato pela atenção
Sanses


Sanses

Sanses

Responder

Posts

12/07/2004

Nildo

    dispose(cliente); 
    cliente^.Socket.Data:=nil; 


não seria o inverso?

    cliente^.Socket.Data:=nil; 
    dispose(cliente); 



Porque você está liberando o ponteiro e depois reacessando-o para definiar Data como nil. Então voce deve primeiro definir Data como Nil e depois dar o Dispose.


Responder

12/07/2004

Sanses

ok nildo, vou tentar, mas é que já havia colocado assim no programa todo e não tinha observado problema, até estava funcionando legal, mas voufazer como voce falou e depois posto o resultado.

Sanses


Responder

13/07/2004

Sanses

Olá Nildo,

Fiz como voce falou, troquei as posições do código, mas continua dando erro. É bem verdade que diminuiu bastante mas ainda assim dá o tla do erro. Tem mais alguma idéia do que pode ser, pois eu já esgotei e ainda não consegui a solução.
Obrigado.

Sanses


Responder

13/07/2004

Nildo

Um outro erro que encontrei foi o seguinte:
No FOR você faz algumas comparações e dá um DISPOSE no PCliente. Como você disse, o FOR vai se executar várias vezes, vai chegar uma hora que você vai dar o DISPOSE e em uma outra passagem do FOR você tenta acessar as propriedades dele novamente, ou então tenta dar um DISPOSE sendo que ele já está ´DISPOSADO´ resultando em erros. Entendeu?


Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar