AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Server: Socket-Fehler # 10054
Thema durchsuchen
Ansicht
Themen-Optionen

Server: Socket-Fehler # 10054

Ein Thema von Master of Phoenix · begonnen am 28. Sep 2007 · letzter Beitrag vom 5. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
Master of Phoenix

Registriert seit: 28. Sep 2007
4 Beiträge
 
#1

Server: Socket-Fehler # 10054

  Alt 28. Sep 2007, 14:58
Hey,

also ich hab schon das Forum hier durchsucht und bei google gesucht, aber die möglichen Lösungen haben entweder nicht funktioniert, oder ich hab sie nicht verstanden. Programmier mit Delphi jetzt erst seit 1 1/2 Jahren inner Schule.

Auf jedenfall hab ich mit den Indy Klassen TCPClient und TCPServer einen Chat programmiert. Den Client hab ich nebenläufig programmiert, sodass ich keinen Timer benutze der "nur" alle 500 Millisekunden die Nachrichten ausliest.

Der Chat funktioniert soweit wunderbar, aber ich hab ein Problem, wenn sich der Client nicht abmeldet (Wenn er also z.b. über Task-Manager-> Prozesse einfach beendet wird). Dann kommt beim Server die Fehlermeldung: Socket-Fehler # 10054 Die Verbindung wurde von Peer zurückgesetzt.

Hier erma der Code:
Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string;
begin
   with AThread.Connection do
   begin
      s:=readln;
      //Der Fehler ist bei diesem s:=readln
      //Hier kommt dann das, was der Server machen soll, wenn s ein Protokollbefehl ist:
      //Also if s='...' then ...
   end;
end;
So, wenn sich also ein Client nicht abmeldet, dann stürzt mein Server an der stelle s:=readln ab.
Ist soweit auch verständlich, aber ich krieg diesen Fehler nicht weg, egal was ich bisher versucht habe.

Hoffe ihr könnt mir da helfen.


Greetz

Master of Phoenix
  Mit Zitat antworten Zitat
Master of Phoenix

Registriert seit: 28. Sep 2007
4 Beiträge
 
#2

Re: Server: Socket-Fehler # 10054

  Alt 29. Sep 2007, 23:52
Hat denn keiner von euch vllt nen Ansatz wie man das Problem lösen könnte??
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#3

Re: Server: Socket-Fehler # 10054

  Alt 30. Sep 2007, 00:36
Habe bisher noch nicht mit den Indys gearbeitet, aber es müsste doch eine Möglichkeit geben, mit der du feststellen kannst, ob der Client noch verbunden (Connected?) ist.
  Mit Zitat antworten Zitat
paritycheck

Registriert seit: 8. Feb 2005
51 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Server: Socket-Fehler # 10054

  Alt 30. Sep 2007, 00:39
Zitat von Master of Phoenix:
Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string;
begin
   with AThread.Connection do
   begin
      s:=readln;
      //Der Fehler ist bei diesem s:=readln
      //Hier kommt dann das, was der Server machen soll, wenn s ein Protokollbefehl ist:
      //Also if s='...' then ...
   end;
end;
Versuch mal ob das funktioniert:

Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string;
begin
   with AThread.Connection do
   try
      s:=readln;
      //Der Fehler ist bei diesem s:=readln
   except
     on e: exception do
        Showmessage(e.Message); //Hier den Fehler behandeln also in deinem Fall Socket-Fehler # 10054
   end;
end;


Gruss
  Mit Zitat antworten Zitat
Master of Phoenix

Registriert seit: 28. Sep 2007
4 Beiträge
 
#5

Re: Server: Socket-Fehler # 10054

  Alt 30. Sep 2007, 01:00
Zitat:
Versuch mal ob das funktioniert:
Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var s:string;
begin
   with AThread.Connection do
   try
      s:=readln;
      //Der Fehler ist bei diesem s:=readln
   except
     on e: exception do
        Showmessage(e.Message); //Hier den Fehler behandeln also in deinem Fall Socket-Fehler # 10054
   end;
end;
Hmm, das einzige was jetzt kommt ist die Fehlermeldung, aber der Server stürzt trotzdem ab. Selbst wenn ich noch ein AThread.connection.disconnect; hinzufüge. Das einzige is jetzt, dass ich den Server weiter benutzen kann (die Oberfläche) sobald jedoch ein neuer Client verbinden will oder ein schon angemeldeter schreibt kommt wieder die Fehlermeldung.

Würd das aber gerne so haben, dass wenn der Fehler kommt diese Verbindung einfach geschlossen wird und der rest weiter arbeitet und sich nicht auf alle Verbindungen auswirkt.

Zitat von Phistev:
Habe bisher noch nicht mit den Indys gearbeitet, aber es müsste doch eine Möglichkeit geben, mit der du feststellen kannst, ob der Client noch verbunden (Connected?) ist.
Naya, das war das, was ich als erstes versucht habe:

Delphi-Quellcode:
if Athread.Connection.Connected=true then
   with AThread.Connection do
   begin
      s:=readln;
      //...
   end;
Funktioniert aber auch nicht und is glaub ich nen Denkfehler, da der Server ja eigentlich noch denkt, dass er ne Verbindung hat, er kann nur nicht readln Ausführen.
  Mit Zitat antworten Zitat
Master of Phoenix

Registriert seit: 28. Sep 2007
4 Beiträge
 
#6

Re: Server: Socket-Fehler # 10054

  Alt 1. Okt 2007, 18:28
Hat niemand ne Lösung? Wenns auch nur nen Ansatz wär, würde vllt. ja schon reichen.

Ich möchte einfach nich, dass mein Server abstüzt, nur weil ein Client sich nicht abgemeldet hat.
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#7

Re: Server: Socket-Fehler # 10054

  Alt 1. Okt 2007, 18:54
Thread.Connection.CheckForDisconnect evtl.?
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

Re: Server: Socket-Fehler # 10054

  Alt 1. Okt 2007, 19:06
Hi,
ich würde für so einen Zweck den TidIRCServer nehmen, der ist direkt für sowas gedacht und hat ein recht stabiles Verhalten.
Karl-Heinz
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Server: Socket-Fehler # 10054

  Alt 3. Apr 2008, 19:01
Man muss doch eigentlich immer damit rechnen, dass ein Client auch mal ohne Abmeldung verschwindet... Außerdem gibts doch extra das OnDisconnect Event. Naja, jedenfalls habe ich das selbe Problem wie MoP.

Ich hatte zuerst einen TCPServer benutzt, nachdem ich die Beiträge hier gelesen hatte, habe ich es dann mit einem IRCServer probiert und auch AContext.Connection.CheckForGracefulDisconnect(tru e); eingebaut. Leider ohne Erfolg. Hier erstmal mein Code:

Delphi-Quellcode:
var
  Server: TServer;
  ClientIDs: set of byte;
  Clients: Array[0..255] of TLWPClient;

implementation

{$R *.dfm}

procedure TServer.BtServerClick(Sender: TObject);
begin
  if IRCServer.Active then begin
    IRCServer.Active:=false;
    BtServer.Caption:='Starten';
    Memo.Lines.Add('Server gestoppt.');
  end else begin
    try
      IRCServer.DefaultPort:=strtoint(EdPort.text);
      IRCServer.Active:=true;
      BtServer.Caption:='Stoppen';
      Memo.Lines.Add('Server gestartet (Port: ' + EdPort.text + ').');
    except
      Memo.Lines.Add('Server konnte nicht gestartet werden.');
    end;
  end;
end;

procedure TServer.IRCServerConnect(AContext: TIdContext);
var
  tmpClient: TLWPClient;
  i: byte;
begin
  tmpClient:=TLWPClient.Create;
  while ((i<255) and (i in ClientIDs)) do Inc(i);
  tmpClient.ID:=i;
  tmpClient.IP:=AContext.Binding.PeerIP;
  AContext.Data:=TObject(i);
  Clients[i]:=tmpClient;
end;

procedure TServer.IRCServerDisconnect(AContext: TIdContext);
begin
  AContext.Connection.CheckForGracefulDisconnect(true);
  Clients[Byte(AContext.Data)].Destroy;
  ClientIDs:=ClientIDs - [Byte(AContext.Data)];
end;

end.
Wenn ich den Server und einen zugehörigen Client starte, verbinde und dann wieder trenne, bekomme ich folgende Meldungen:
1.) (Von Delphi)
Zitat:
Debugger Exception Notification

Project TheServer.exe raised exception class EIdSocketError with Message 'Socket Error # 10054 Connection reset by peer.'.
2.) (Vom Programm)
Zitat:
Application Error

Exception EAccessViolation in module TheServer.exe at 0000031BA.
Access coilation at address 004031BA in module 'TheServer.exe'. Read of address 00000040
3.) (Auch vom Programm)
Zitat:
Application Error

Exception EOSError in module TheServer.exe at 0000CB89.
System Error. Code: 5.
Zugriff verweigert.
Danach wird das Programm beendet.

Wäre schön, wenn jemand da einen Rat hätte.
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat
Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Server: Socket-Fehler # 10054

  Alt 5. Apr 2008, 16:46
Push *duck*

Hat keiner ne Idee? Ich möchte ja ertsmal nur erreichen, dass der Server nicht gleich abstürzt... Ob ein Client noch da ist lässt sich ja rausfinden...
Max
"Das Ziel ist im Weg!"
  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:22 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