Array
(
)

ClientSocket - Requisição

Tremonti
   - 15 mar 2006

Galera, estou com o código a seguir

Query1.Open;
Query1.First;
While not Query1.Eof Do
Begin
i := 0;
ClientSocket.Host := Query1nmMaq.AsString;
ClientSocket.Active := True;
while not ClientSocket.Socket.Connected Do
Begin
Application.ProcessMessages;
i := i + 1;
if i > 50 Then Break;
End; //While
if ClientSocket.Active = True Then
Begin
ClientSocket.Socket.SendText(´RequestLetreiro´);
Sleep(1000);
End; //ClientSocket
Query1.Next;
ClientSocket.Active := False;
End;

e com a seguinte duvida...

Eu preciso mandar essa requisição para todos os usuarios logados a partir desta quer.
Só que o que acontece, de vez em quando fica o usuario logado mesmo ele nao estando, por exemplo , a maquina desligou sozinha.
Mas dento deste loop esle acaba passando muito rapido pelo active do componente socket e ele nao ativa a conexão. Fazendo com que nao envie a solicitação.

Gostaria de alguma dica de como evitar isto

Alguem poderia me dar uma ajudinha?!
no código acima impus um limite de tempo, mas nao esta funcionando corretamente.

Queria algo do tipo:
ele tenta a conexão com a maquina até um determinado instante, se nao conseguir, vai pra proxima maquina.

Obrigado e Aguardo Respostas.


Ipc$
   - 16 mar 2006

Coloque um timeout de conexão:#Código

var tmp:DWord;
tmp := GetTickCount;
ClientSocket.Active := True;
while not ClientSocket.Active and ((GetTickCount - tmp) < 5000) do
begin
Application.ProcessMessages;
Sleep(1);
end;

Uma dúvida: pq vc faz Query1.First; após Query1.Open; ?


Tremonti
   - 16 mar 2006

Nao entendi seu codigo
em relação ao first... é porque ganho por linha...rs


Ipc$
   - 16 mar 2006

Bom, o código acima tenta a conexão com o TServerSocket durante 5 segundos. Vc também pode definir no evento onError do TClientSocket: ErrorCode := 0; assim se houver erro de conexão, a exceção não é lançada.


Tremonti
   - 16 mar 2006

nao deu certo cara

deu um erro de assychrnous


Ipc$
   - 16 mar 2006

Bom, comigo não dá erro. Verifique se o TServerSocket está no ar, se a porta está certa e se ele está aceitando a conexão no evento onAccept.
No meu caso, nunca passo o Host no TClientSocket e sim o Address.


Tremonti
   - 22 mar 2006

Assim Funciona, pra quem quizer!!!

Query1.Open;
While not Query1.Eof Do
Begin
tmp := 0;
ClientSocket.Host := Query1nmMaq.AsString;
ClientSocket.Active := True;

while ((ClientSocket.Active = False) And (tmp < 5)) do
Begin
try
Application.ProcessMessages;
except
Break;
end; //Try
tmp := tmp + 1;
Sleep(100);
End;

if ClientSocket.Active = True Then
Begin
ClientSocket.Socket.SendText(´RequestLetreiro´);
Sleep(100);
End //ClientSocket
else
Begin
Query1.Delete;
Query1.ApplyUpdates;
End;

ClientSocket.Active := False;
Query1.Next;
End;