Announcement

Collapse
No announcement yet.

Doppelte Events nach Netztrennung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Doppelte Events nach Netztrennung

    Hallo zusammen,

    ich habe eine kleine Client Server Anwendung programmiert. Server und Client laufen auf verschiedenen Computern.
    Der Server Stellt in seiner TLB ein Interface zur verfügung welches einen Ping Aufruf besitzt. Der Client Pingt den Server über diesen Aufruf alle 100 ms.

    Code:
    myServerObj:TServerObjekt;
    [...]
    repeat
       try
          myServerObj1.Ping
       except
          myServerObj.Disconnect;
          sleep(1000);
          myServerObj1.Connect;
       end;
       sleep(100);
    until self.Terminated
    Wenn ich den Server im Taskmanager nun terminiere, bekommt der Client eine Exception und connected neu.

    Anders sieht es aus wenn ich am Client den Netzwerkstecker ziehe. Ich warte so lange bis der Client ins Except läuft, und stecke dann wieder ein.
    Nach zwei Thread durchläufen connected der client sich wieder und meldet "Online".
    Allerdings habe ich für jedes mal Netzwerkstecker ziehen eine EventSink mehr in meiner Serverseitigen SinkList.


    Code:
    procedure TServerObjekt.DoSendEvent(Msg:String);
    var EventSink:IServerObjektEvents;
    i:integer;
    begin
      i:=0;
      while i<=FConnectionPoint.SinkList.Count -1 do
      begin
        EventSink:=IUnknown(FConnectionPoint.SinkList.Items[i]) as IServerObjektEvents;
        try
          EventSink.OnChatMessage(Msg);
        except
          FConnectionPoint.SinkList.Items[i]:=nil;
          //Diese Sink Entfernen
        end;
      end;
      FConnectionPoint.SinkList.Pack;
    end;
    Jede dieser N Sinks scheint gültig zu sein - löst in obiger procedure kein except aus. Der Client erhält ein und den selben Event jetzt N fach.


    Das Verhalten ist reproduzierbar. Für jedes mal Netzstecker ziehen einen Eintrag mehr in der EventSink.

    Weiß jemand Abhilfe? Ich bin am verzweifeln...
    Habe auch schon in Herrn Kosch's Buch nachgeschlagen und leider keine Lösung gefunden.


    Anmerkung:
    Server und Clients setzen vor dem Application.Initialize Coinitflags:=0 und IsMultiThread:=true.

    Das Objekt in den Clients steht auf ckRemote.
    Serverseitig ist das Objekt mit ciMultiInstance und tmBoth initialisiert.


    Vielen Dank für eure Hilfe.

  • #2
    Hallo,

    ich habe mittlerweile in meinem Server Tracing nachgezogen. Die Pointer auf die Sink lasse ich mir nun im Logfile ausgeben.
    Es scheint so als sei der selbe Client mit seiner Sink N-Fach in der Sinklist eingetragen.
    Aus diesem Grund ist auch jeder der Pointer gültig.

    Wäre toll wenn mir jemand ein Beispiel für einen Automatischen Reconnect nach Netztrennung nennen könnte. Ich vermute mittlerweile dass ich im Ablauf Connect / Disconnect vielleicht ein Problem habe.

    Comment

    Working...
    X