Entwickler-Ecke

Internet / Netzwerk - IdTCPClient OnDisconnect Problem


alleinherrscher - Mi 21.06.06 20:13
Titel: IdTCPClient OnDisconnect Problem
Hi@all!

Man stelle sich folgendes vor: Ich habe einen TCPClient, der brav an den Server daten schickt. Das OnDisconnected Ereignis hab ich mit einer Prozedur verbunden, die momentan nix anderes macht, als einen Interger Counter hochzuzählen (inc(Counter))

Wenn ich jetz drei mal nach einander Daten verschicke bleibt der Counter auf dem Wert 0, daraus schließe ich jetzt mal, dass OnDisconnected gar nicht nach beenden des Übertragens aufgerufen wird...kann mir da jemand was zu erklären?

Imprinzip wollte ich folgendes machen: Während des Sendens soll es möglich sein, weitere Dateien zu verschicken. Und das wie folgt: Die noch zu versendenden Packete werden in einer Warteschleife gespeichert und sollen nacheinander an verschiedene Rechner (Server) verschickt werden, sobald die bestehende Verbindung beendet wird.

Das ganze sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
  TQUEUE = class
    pack:TPACKAGE; //Im wesentlichen ein MemoryStream
    Host:String;
    next:TQUEUE;
  end;

[...]
var queue1:Tqueue; 

[...]
//On Create:
queue1:=NIL;


[...]
procedure AddToQueue(pack:TPACKAGE;Host:String);

var GoThroughQueue,NewQueueElement:TQUEUE;
begin

if queue1=nil then
  if not TCPClient1.connected then sendpackage(pack,host) 
//sendet das Packet direkt, falls kein Element in der Schlange ist

     else begin
        queue1:=TQUEUE.Create;
        queue1.pack:=pack;
        queue1.Host:=Host;
        queue1.next:=NIL;
     end
  else begin {queue1 <> Nil}
        NewQueueElement:=TQUEUE.Create;
        NewQueueElement.pack:=pack;
        NewQueueElement.Host:=Host;
        NewQueueElement.Next:=Nil;

        GoThroughQueue:=queue1;
        while GoThroughQueue.Next<>NIL do
          GoThroughQueue:=GoThroughQueue.Next;
        GoThroughQueue.Next:=NewQueueElement;
  end;

end;


[...]

//Nun soll beim Disconnect vom TCPClient ein Packet nach dem anderen gesendet werden:

TCPClient1.OnDisconnected:=ExecuteQueue;


procedure ExecuteQueue(Sender:Tobject);
begin
    counter:=counter+1;

 if not (queue1=nilthen begin
  SendPackage(queue1.pack,queue1.Host);
  queue1:=queue1.next;
 end;  


end;


Leider wird nix gesendet, das ganze funktioniert nur solange Queue1=Nil ist, ExecuteQueue wird scheinbar nicht aufgerufen?!?

Kann mir jemand helfen?

Liebe Grüße,
ALleinherrscher


digi_c - Fr 23.06.06 09:02

OnDisconnect wird IMHO nur aufgerufen, wenn der Client/Server die Verbindung beendet wird und nicht wenn nur keine Daten mehr übertragen werden.

Beim anderen weiß ich aber auch nicht bescheid wie man das am besten macht...


alleinherrscher - Fr 23.06.06 16:35

user profile icondigi_c hat folgendes geschrieben:
OnDisconnect wird IMHO nur aufgerufen, wenn der Client/Server die Verbindung beendet wird und nicht wenn nur keine Daten mehr übertragen werden.

Beim anderen weiß ich aber auch nicht bescheid wie man das am besten macht...


Danke, für deine Antwort :) Wäre schön, wenn OnDisconnect aufgerufen wird, wenn die Verbindung zwischen Client/Server beendet wird, denn: Sobald bei mir ein Datenpacket verschickt wurde (von Clinet an Server) schließt der Client die Verbindung, und müsste doch dann direkt in die OnDisconnect routine springen, und von dort aus über "sendpackage(...)" praktisch sich selber neu Verbinden, falls packete in der Warteschlange sind...


alias5000 - Fr 23.06.06 17:58

Du meinst vllcht eher sowas wie OnWorkEnd?


alleinherrscher - Fr 23.06.06 19:25

user profile iconalias5000 hat folgendes geschrieben:
Du meinst vllcht eher sowas wie OnWorkEnd?


Ich suche imprinzip nen Event aus was ausgeführt wird, wenn der Client die Verbindung getrennt hat, um dann ne neue Verbindung herstellen zu können.

Wenn ich mit OnWorkEnd arbeite kommt leider die Meldung "Already Connected", nur um das nochmal zu erklären:

Ich möchte nicht mehrere Streams mit einer Verbindung verschicken. Die Verbindung soll jedes mal vor dem Verschicken getrennt sein und dann neu aufgebaut werden, da jeder Stream theoretisch an einen anderen Server (also Computer mit IP) gesendet werden kann.

Viele Grüße