Einzelnen Beitrag anzeigen

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