desconexão de sokets
12/07/2004
0
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
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.
12/07/2004
Sanses
Sanses
13/07/2004
Sanses
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
13/07/2004
Nildo
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?
Clique aqui para fazer login e interagir na Comunidade :)