Synapse - Client Socket Schließen

Alle Fragen zur Netzwerkkommunikation
Antworten
redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Synapse - Client Socket Schließen

Beitrag von redplug »

Hi.
Ich Versuche gerade ein Client Socket zu Schließen.

Jedoch Funktioniert es nicht richtig.

Code: Alles auswählen

procedure TClient.Disconnect;
begin
  Echo('DD1', Data.Id);
  ThreadSock.CloseSocket; //Line 32
  Echo('DD2', Data.Id);
  ThreadSock.Free;
  Echo('DD3', Data.Id);
  Disconnectet := True;
end;
 
{ [...] }
 
procedure TClient.Execute;
var
  S: string;
begin
  ThreadSock := TTCPBlockSocket.Create;
  try
    ThreadSock.socket := CSock;
    ThreadSock.GetSins;
    repeat
      if Terminated or Disconnectet then break;
      S := ThreadSock.RecvPacket(60000);
      S := Receive(S);
      if ThreadSock.lastError<>0 then break;
      if not (S = '') then
        ThreadSock.SendString(S);
      if ThreadSock.lastError<>0 then break;
    until false;
  finally
    Echo('TT1', Data.Id);
    ThreadSock.CloseSocket;
    Echo('TT2', Data.Id);
    ThreadSock.Free;
    Echo('TT3', Data.Id);
  end;
end;


Wenn ich dann diesen Disconnect ausführen möchte passiert folgendes:

Code: Alles auswählen

[05.06.2010 21:28:59.573] #0: DD1
[05.06.2010 21:28:59.573] #0: TT1
[05.06.2010 21:28:59.573] #0: TT2
[05.06.2010 21:28:59.574] #0: TT3
An unhandled exception occurred at $0000000000477BAC :
EAccessViolation : Access violation
  $0000000000477BAC line 2470 of blcksock.pas
  $00000000004781D7 line 2537 of blcksock.pas
  $000000000047CC6D line 3641 of blcksock.pas
  $0000000000480121 line 32 of Client.pas
  $0000000000413F5F line 106 of project1.lpr


Warum leuft aber TT1, TT2 und TT3 ohne exception durch?

redplug
Beiträge: 31
Registriert: So 22. Nov 2009, 20:35

Re: Synapse - Client Socket Schließen

Beitrag von redplug »

Es hat sich erledigt:


so funktioniert es für mich:

Code: Alles auswählen

procedure TClient.Disconnect;
begin
  Terminate;
end;
 
{ [...] }
 
procedure TClient.Execute;
var
  S: string;
begin
  ThreadSock := TTCPBlockSocket.Create;
  try
    ThreadSock.socket := CSock;
    ThreadSock.GetSins;
    repeat
      if Terminated then break;
      S := ThreadSock.RecvPacket(60000);
      S := Receive(S); //Nur hier
      if ThreadSock.lastError<>0 then break;
      if not (S = '') then
        ThreadSock.SendString(S);
      if ThreadSock.lastError<>0 then break;
    until false;
  finally
    ThreadSock.CloseSocket;
    ThreadSock.Free;
  end;
end;


Das funktioniert nur wen das Daisconnect an der Markierten Stelle passiert.
Wobei ich auch denke später. jedoch vor dem if Terminated then break;

Antworten