GARANTIR DESCONTO

Fórum Problema com Socket (erro 10048) #297385

28/09/2005

0

Olá a todos..

Eu tento conectar.. blz, tudo certo..
fecho o cliente..
ao abrir denovo e tentar conectar.. ´Erro 10048, conexão já existente´


Não estou desconectando corretamente a fechar o cliente?
Têm como eu fechar todas as conexões? ou algo assim antes de conectar?

valeu


Amon-ra

Amon-ra

Responder

Posts

28/09/2005

Crash

esse erro ocorre no cliente?


Responder

Gostei + 0

28/09/2005

Crash

caso for no cliente tente ClientSocket.Active:= False;
ou ClientSocket.Socket.Disconnect;


Responder

Gostei + 0

29/09/2005

Amon-ra

caso for no cliente tente ClientSocket.Active:= False; ou ClientSocket.Socket.Disconnect;


Ocorre no cliente, isso que você falou eu já tentei não dá :(
Eu trato o erro.. aí peço pra desconectar e tentar denovo.. só que tenho q esperar um tempo sem executar o programa pra porta deixar de estar sendo usada.


Responder

Gostei + 0

29/09/2005

Martins

[quote:3931811eae=´Amon-Ra´]
caso for no cliente tente ClientSocket.Active:= False; ou ClientSocket.Socket.Disconnect;


Ocorre no cliente, isso que você falou eu já tentei não dá :(
Eu trato o erro.. aí peço pra desconectar e tentar denovo.. só que tenho q esperar um tempo sem executar o programa pra porta deixar de estar sendo usada.[/quote:3931811eae]

Como é q vc tá fazendo a conexão e como está fechando? Posta aqui um pedaço dos códigos.


Responder

Gostei + 0

29/09/2005

Amon-ra

procedure Tlincenet.Button1Click(Sender: TObject);
var
teste : TTreeNode;
begin
try
  IdTCPClient1.Connect;
except
  IdTCPClient1.IOHandler.Free;
  end;
end;

procedure Tlincenet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Application.ProcessMessages;
IdTCPClient1.DisconnectSocket;
IdTCPClient1.Disconnect;
end;



É isso, por q é só um teste mesmo..


Aproveitando o servidor é assim:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
IdTCPServer1.Active := false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if IdTCPServer1.Active then
begin
end
else
begin
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IdTCPServer1.Active = true then
  begin
  Button1.Caption := ´Conectar´;
  IdTCPServer1.Active := false;
  end
else
  begin
  Button1.Caption := ´Desconectar´;  
  IdTCPServer1.Active := true;
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
funcionando : boolean;
temp : string;
begin
funcionando := true;
while funcionando do
  begin
    try
    temp := AThread.Connection.ReadLn();
    except
    funcionando := false;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
form2.Show;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;



Responder

Gostei + 0

29/09/2005

Massuda

Me parece que você está usando Indy e não TClientSocket/TServerSocket.

Com relação ao seu código cliente, experimente fazer assim (não testei)...
procedure Tlincenet.Button1Click(Sender: TObject);
var
  teste : TTreeNode;
begin
  try
    IdTCPClient1.Connect;
  except
    // isto não é necessário!
    //IdTCPClient1.IOHandler.Free;
  end;
end;

procedure Tlincenet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // isto não é necessário!
  //Application.ProcessMessages;
  //IdTCPClient1.DisconnectSocket;
  IdTCPClient1.Disconnect;
end;

Já o código do servidor tem um pequeno problema...
uses
  IdGlobal,
...
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  funcionando : boolean;
  temp : string;
begin
  funcionando := true;
  while funcionando and not AThread.Stopped do begin
    try
      temp := AThread.Connection.ReadLn(LF, 500);
    except
      funcionando := false;
    end;
  end;
end;
...
...a diferença é que é feito um teste para ver se a thread foi interrompida pelo servidor (AThread.Stopped) e inclui um timeout (tempo máximo de espera) na leitura da string (não testei). Isso é necessário porque o servidor não detecta de imediato a desconexão do cliente (isso é característica do meio de comunicação, não é problema do Indy).


Responder

Gostei + 0

29/09/2005

Martins

Me parece que você está usando Indy e não TClientSocket/TServerSocket. Com relação ao seu código cliente, experimente fazer assim (não testei)...
procedure Tlincenet.Button1Click(Sender: TObject);
var
  teste : TTreeNode;
begin
  try
    IdTCPClient1.Connect;
  except
    // isto não é necessário!
    //IdTCPClient1.IOHandler.Free;
  end;
end;

procedure Tlincenet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // isto não é necessário!
  //Application.ProcessMessages;
  //IdTCPClient1.DisconnectSocket;
  IdTCPClient1.Disconnect;
end;
Já o código do servidor tem um pequeno problema...
uses
  IdGlobal,
...
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  funcionando : boolean;
  temp : string;
begin
  funcionando := true;
  while funcionando and not AThread.Stopped do begin
    try
      temp := AThread.Connection.ReadLn(LF, 500);
    except
      funcionando := false;
    end;
  end;
end;
...
...a diferença é que é feito um teste para ver se a thread foi interrompida pelo servidor (AThread.Stopped) e inclui um timeout (tempo máximo de espera) na leitura da string (não testei). Isso é necessário porque o servidor não detecta de imediato a desconexão do cliente (isso é característica do meio de comunicação, não é problema do Indy).


Blz [b:8a10d2ecab]Massuda[/b:8a10d2ecab], até eu vou fazer uns testes aqui. Show de bola!!!!


Responder

Gostei + 0

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

Aceitar