AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Connection Closed Gracefully.

Ein Thema von RedShakal · begonnen am 21. Dez 2009 · letzter Beitrag vom 21. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
RedShakal
(Gast)

n/a Beiträge
 
#1

Connection Closed Gracefully.

  Alt 21. Dez 2009, 00:00
Hallo, wie ein paar von euch wissen hab ich ja einen kleinen Server geschrieben der auf einen Linux Debian Vserver laufen soll. Da ich zu doof bin den Server für Linux zu kompilen, habe ich ihn bis jetzt immer mit Wine Emuliert. Das klappte bis jetzt auch sehr gut. Heute habe ich allerdings ein Logfile eingebaut und seitdem klappt er nichtmehr richtig. Okok er klappt garnicht mehr. Sobald jemand connected wird die Verbindung abgebrochen.

Ich poste einen Teil des Sourcecodes:

Delphi-Quellcode:
AssignFile(f, 'log\'+DateToStr(Date)+'.txt');
   if FileExists('log\'+DateToStr(Date)+'.txt') then
     begin
       Append(f)
     end
   else
     begin
       Rewrite(f);
     end;

Genau an der Rewrite stelle bleibt er stehen.


- Ich habe bereits versucht den Datein die Chmod rechte zu geben.
- Ich habe bereits allen Datein und Ordnern testweise 777 gegeben.
- ich habe versucht statt log\ einfach mal log/ zu machen
- ich habe versucht die Datei manuell zu erstellen. Er springt trozdem zu Rewrite
- Ich habe versucht das ganze als Root im Home verzeichnis auszuführen

Was kann ich noch tun?


P.S. Unter Windows läuft der Server übrigens Problemlos.


Edit: Auch wenn sich die Log Datein im gleichen Verzeichnis befinden wie der Server befinden, klappt es nicht.
"AssignFile(f, DateToStr(Date)+'.txt');"


Edit: Ich glaub ich hab den Fehler gefunden. Ich habe eine Debug Nachicht eingebaut die mir statt 21.12.09 folgendes ausgegeben hat:

"File log\12/21/2009.txt existiert nicht"


Edit:

So ich hab das Problem jetzt gelöst.

Delphi-Quellcode:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext);
var
   f : TextFile;
   Files : string;
   myDate : TDateTime;
   myYear, myMonth, myDay : Word;
begin
  myDate := Date;
  DecodeDate(myDate, myYear, myMonth, myDay);

   Files := ('log\'+IntToStr(myDay)+'-'+IntToStr(myMonth)+'-'+IntToStr(myYear)+'.txt');
   AssignFile(f, Files);
   if FileExists(Files) then
     begin
       Append(f)
     end
   else
     begin
       Rewrite(f);
     end;
Begründung:

Unter Windows gibt Date "21.12.09" aus. Unter Linux jedoch "12/21/2009". Dies führt zu komplikationen bei den Pfadangaben und damit zum Fehler.
Lösung: mit DecodeDate das Datum in die Einzelteile aufteilen und anschließend selbst zusammensetzen. Ich habe als Trennzeichen "-" benutzt.
Damit erhalte ich Datumsangaben im format "21-12-09".
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 00:54
Zitat von RedShakal:
Was kann ich noch tun?
Hallo RedShakal, womöglich liegts an der IO Prüfung?

Delphi-Quellcode:
  
  AssignFile(f, 'log\' + DateToStr(Date) + '.txt');
  if FileExists('log\' + DateToStr(Date) + '.txt') then
    {$I-} Append(f) else Rewrite(f); {$I+}

  if IOResult <> 0 then RaiseLastWin32Error;
Was gibt hier IOResult aus?

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
RedShakal
(Gast)

n/a Beiträge
 
#3

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 01:12
Das Problem ist doch noch nicht so gelöst wie ich dachte.

Delphi-Quellcode:
myDate := Date;
  DecodeDate(myDate, myYear, myMonth, myDay);

   Files := ('log\'+IntToStr(myDay)+'-'+IntToStr(myMonth)+'-'+IntToStr(myYear)+'.txt');
   AssignFile(f, Files);

   if FileExists(Files) then
     begin
       Append(f);
       WriteLn('ap');
     end
   else
     begin
       Rewrite(f);
       WriteLn('rw');
     end;
So sieht meine Konsole aus:

Delphi-Quellcode:
#######################
## ##
## Masterserver 0.03 ##
## ##
#######################

Server wurde initialisiert.
Server lauscht auf Port: 5000

ap
[2:10:00 AM] Account: fff existiert nicht.
ap
Beim ersten durchlauf klappt alles. ( Was mich wundert ist das er Append(f); 2x aufruft.
Beim zweiten durchlauf gibts wieder die Meldung "Connection Closed Gracefully."
Er scheint aber dennoch mind. bis "AssignFile(f, Files);" zu arbeiten. Wenn ich da eine WriteLn einbaue, wird diese trozdem noch aufgerufen.



Edit:

Die Datei wird ordnungsgemäß über Closefile geschlossen.
Beim zweiten durchlauf bleibt er bei "Append(f);" stehen.
Die Frage die sich stellt: Wieso ruft er "Append(f);" 2x auf. Nirgenswo ist eine schleife einprogrammiert...


Edit:

Ich poste am besten mal den kompletten Part:

Delphi-Quellcode:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext);
var
  Data : String;
  StrArr : TDynStringArray;
  ini : TIniFile;
   f : TextFile;
   Files : string;
   myDate : TDateTime;
   myYear, myMonth, myDay : Word;
begin
 with AThread.Connection do
begin
  myDate := Date;
  DecodeDate(myDate, myYear, myMonth, myDay);

   Files := ('log\'+IntToStr(myDay)+'-'+IntToStr(myMonth)+'-'+IntToStr(myYear)+'.txt');
   AssignFile(f, Files);

   if FileExists(Files) then
     begin
       Append(f);
     end
   else
     begin
       Rewrite(f);
     end;

   Data := String(Socket.ReadLn);
   Data := Trim(Data);
   if Length(Data) > 0 then
     begin
       StrArr := Explode('|', Data);
       if StrArr[0] = 'loginthen
         begin
             if StrArr[3] = Clientver then
               begin
                 if FileExists('accounts\'+StrArr[1]+'.ini') then
                   begin
                     ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
                     try
                       if StrArr[2] = ini.ReadString('Data','Passwort','') then
                         begin
                           Socket.WriteLn('login');
                           WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.');
                           WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.');
                         end
                       else
                         begin
                           Socket.WriteLn('invalid');
                           WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.');
                           WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.');
                         end;
                     finally
                       ini.free;
                     end;
                   end
                 else
                   begin
                     Socket.WriteLn('na');
                     WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.');
                     WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.');
                   end;
               end
                 else
                   begin
                     Socket.WriteLn('version');
                   end;
         end;

       if StrArr[0] = 'registerthen
         begin
           if FileExists('accounts\'+StrArr[1]+'.ini') then
             begin
               Socket.WriteLn('vorhanden');
               WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.');
               WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.');
             end
           else
             begin
               try
                 ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
                 ini.WriteString('Data','Passwort',StrArr[2]);
                 ini.WriteString('Data','E-Mail',StrArr[3]);
               finally
                 Socket.WriteLn('erfolg');
                 ini.free;
                 WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.');
                 WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.');
               end;
             end;
         end;
     end;
 end;
  CloseFile(f);
end;


Zitat von Astat:
Zitat von RedShakal:
Was kann ich noch tun?
Hallo RedShakal, womöglich liegts an der IO Prüfung?

Delphi-Quellcode:
  
  AssignFile(f, 'log\' + DateToStr(Date) + '.txt');
  if FileExists('log\' + DateToStr(Date) + '.txt') then
    {$I-} Append(f) else Rewrite(f); {$I+}

  if IOResult <> 0 then RaiseLastWin32Error;
Was gibt hier IOResult aus?

lg. Astat
Also er zeigt mir in der Tat jetzt einen IO ERROR. Der Fehler tritt sowohl auf Windows als auch auf Linux auf.
"if IOResult <> 0 then RaiseLastWin32Error;" gibt garnichts aus.
Der Debugger sagt folgendes:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EInOutError with message 'I/O error 32'.
---------------------------
Break Continue Help
---------------------------
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 02:02
Zitat von RedShakal:
Das Problem ist doch noch nicht so gelöst wie ich dachte.
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.'; 2. Das Problem mit dem mehrfachen Aufruf:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext); Ist ein Serverthread, dieser wird auch mehrfach aufgerufen werden können.

Dh. Die Log-Schreiberei und Globalen Variablen müssen Threadsave sein, sonst knallts sowiso irgendwann.

Tip: Das Logging in eine Threadsave Funktion auslagern, und mit CriticalSections synchronisieren.

Delphi-Quellcode:
var
  _SyncLog: TRTLCriticalSection;

procedure LogWrite(const ALogfile, AMessage: string);
var
  f: TextFile;
begin
  EnterCriticalSection(_SyncLog);
  try
    AssignFile(f, ALogfile);
    try
      {$I-}
      if FileExists(ALogfile) then Append(f) else Rewrite(f);
      if IOResult <> 0 then Reset(f);
      {$I+}
      Writeln(f, AMessage);
    finally
      CloseFile(f);
    end;
  finally
    LeaveCriticalSection(_SyncLog);
  end;
end;

initialization
  InitializeCriticalSection(_SyncLog);
finalization
  DeleteCriticalSection(_SyncLog);
end.
lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 06:30
Zitat von Astat:
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.';
Meinst Du nicht, man schießt mit Kanonen auf Spatzen und handelt sich u.U. unangenehme Seiteneffekte ein?
Eine einfache Funktion, die einen Dateinamen für Logdateien erstellt, ist doch ausreichend:
Delphi-Quellcode:
Function GetLogFilename() : String;
Var
  y,m,d : Word;

Begin
  DecodeDate(Now,y,m,d);
  Result := Format('log\%.2d-%.2d-%.2d.TXT',[y,m,d]);
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
RedShakal
(Gast)

n/a Beiträge
 
#6

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 10:56
Zitat von Astat:
Zitat von RedShakal:
Das Problem ist doch noch nicht so gelöst wie ich dachte.
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.'; 2. Das Problem mit dem mehrfachen Aufruf:
procedure TServer.IdTCPServer1Execute(AThread: TIdContext); Ist ein Serverthread, dieser wird auch mehrfach aufgerufen werden können.

Dh. Die Log-Schreiberei und Globalen Variablen müssen Threadsave sein, sonst knallts sowiso irgendwann.

Tip: Das Logging in eine Threadsave Funktion auslagern, und mit CriticalSections synchronisieren.

Delphi-Quellcode:
var
  _SyncLog: TRTLCriticalSection;

procedure LogWrite(const ALogfile, AMessage: string);
var
  f: TextFile;
begin
  EnterCriticalSection(_SyncLog);
  try
    AssignFile(f, ALogfile);
    try
      {$I-}
      if FileExists(ALogfile) then Append(f) else Rewrite(f);
      if IOResult <> 0 then Reset(f);
      {$I+}
      Writeln(f, AMessage);
    finally
      CloseFile(f);
    end;
  finally
    LeaveCriticalSection(_SyncLog);
  end;
end;

initialization
  InitializeCriticalSection(_SyncLog);
finalization
  DeleteCriticalSection(_SyncLog);
end.
lg. Astat

Ehrlich gesagt ist mir der Code etwas zu kompliziert. Schon mein Lehrer hat damals immer gesagt kopiere nie was du nicht verstehst




__________________________________________________ __________


Zitat von alzaimar:
Zitat von Astat:
1. Das Problem mit dem Datumsseparator:
DateSeparator := '.';
Meinst Du nicht, man schießt mit Kanonen auf Spatzen und handelt sich u.U. unangenehme Seiteneffekte ein?
Eine einfache Funktion, die einen Dateinamen für Logdateien erstellt, ist doch ausreichend:
Delphi-Quellcode:
Function GetLogFilename() : String;
Var
  y,m,d : Word;

Begin
  DecodeDate(Now,y,m,d);
  Result := Format('log\%.2d-%.2d-%.2d.TXT',[y,m,d]);
End;
Das klappt so leider auch nicht so ganz. Der IO Fehler besteht trozdem.
Es scheint so als würde er die Datei nicht richtig schließen, weil ich sie solang der Server läuft auch nicht im Windows öffnen kann.
Deshalb habe ich jetzt mal Testweise unter jedes WriteLn ein Closefile geschrieben. Leider ohne erfolg.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 12:01
Delphi-Quellcode:
Function GetLogFilename() : String;
Var
  y,m,d : Word;

Begin
  DecodeDate(Now,y,m,d);
  Result := IncludeTrailingPathDelimiter('log')+Format('%.2d-%.2d-%.2d.TXT',[y,m,d]);
End;
Sind bei Linux die Pfadbegrenzer nicht '/' anstatt '\' ?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
RedShakal
(Gast)

n/a Beiträge
 
#8

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 12:15
Das ganze dürfte durch Wine ausgeglichen werden.
Der Server läuft leider unter Windows genausowenig.
  Mit Zitat antworten Zitat
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 17:10
Bei deinem Pfad muss solltest Du darauf achten / als Ordnergrenze zu verwenden. Zudem, wenn Du von deinem eigenen Pfad ausgehst, musst fehlt davor ein ./, sodas letztendlich der Pfad folgendermaßen aussieht: ./log/Datum.txt.
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#10

Re: Connection Closed Gracefully.

  Alt 21. Dez 2009, 17:22
Zitat von TurboMartin:
Zudem, wenn Du von deinem eigenen Pfad ausgehst, musst fehlt davor ein ./, sodas letztendlich der Pfad folgendermaßen aussieht: ./log/Datum.txt.
Vorallem unter Windows (ich weiß nicht, wie es Linux/Wine mit relativen Pfaden hat) bringt das ./ garnichts, da es im Endefekt auf's Selbe hinausgeht.

Wobei man sowieso keine relativen Pfade nutzen sollte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz