Einzelnen Beitrag anzeigen

Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Pakete über Sockets versenden, Thread hängt sich auf

  Alt 3. Jun 2009, 12:08
Servus,

meine Client/Server Anwendung hat bei der übertragung der Pakete noch ein kleines Problem.
Wenn ich meine Anwendung über Nacht laufen lasse, kommen irgend wann in der Nacht keine Pakete mehr an.
Der Client sendet alle 500ms ein Testpaket.

Der Server bringt nur die Meldung "Thread Fehler Zugriff verweigert (5)"
Jetzt weis ich aber nicht genau wo der Thread hängen bleibt oder wieso.

Das ist meine Methode um die Pakete zu empfangen und dem Thread zu übergeben.
Delphi-Quellcode:
procedure TThreadServer.OnSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  sBuffer,sJob,s : string;
  index : integer;
  cmd,ccmd : TCommandHandling;
  cd : TClientData;
begin
  sBuffer := Socket.ReceiveText;
  //Sammeln von Jobs bis diese komplett sind
  index := fBufferJobs.IndexOfObject(socket);
  if index = -1 then
  begin
    fBufferJobs.AddObject(sBuffer,socket);
    index := fBufferJobs.Count-1;
  end else
    fBufferJobs.Strings[index] := fBufferJobs.Strings[index] + sBuffer;

  //Wenn komplett weiter zur Jobverarbeitung
  sJob := '';
  s := fBufferJobs.Strings[index];

  while Pos(#13#10,s) <> 0 do
  begin
    sJob := copy(s,0,Pos(#13#10,s)+1); //ersten befehl auslesen
    Delete(s,1,length(sJob)); //befehl löschen aus kette
    fBufferJobs.Strings[index] := s; //rest wieder zurück
    if s = 'then begin //leer, dann löschen
      fBufferJobs.Objects[index] := nil;
      fBufferJobs.Delete(index);
    end;
    //Systembefehl? wenn ja direkt verarbeiten und den rest weiter
    //zur jobverabeitung weitergeben.
    if sJob <> 'then
    begin
      cmd := TCommandHandling.Create(CMDNone,'');
      cmd.SetFrames(sJob);
      case cmd.GetCmd of
        SYS_ALIVE : begin
          //...
        end;
        SYS_PING : begin
          //...
        end;
        SYS_AUTHKEY : begin
          //...
        end;
        CMDError : begin
          //...
        end;
      else //kein systembefehl weiter bearbeiten
        fJobThread.AddJobToSocket(socket,sJob);
      end;
      cmd.Free;
    end;
  end;
end;
Die Befehle werden in dieser Art versendet (sJob)
Zitat:
Befehl#13Parameter1#13Par2#13Par3#13#10
Eventuell kann mir ja einer einen Tipp geben.

Mfg
  Mit Zitat antworten Zitat