Hi Leute,
ich habe ein Problem mit dem organisieren von multiplen Verbindungen auf einen Server. Ich kenne die Winsock (ActiveX) sehr gut und habe versucht einen alten VB Code von mir in Delphi umzuschreiben. Dabei bin ich auf folgendees Proglem gestoßen.
Ist die TTcpServer Delphi Komponente erstmal richtig eingestellt und befindet sich im Listen-Mode, wird ja bei jedem erfolgreichem Verbindungsaufbau das OnAccept Event aufgerufen. Bei gescheitertem Verbidnungsaufbau OnError.
Das übergebene Parameter [ClientSocket: TCustomIpClient] veweist dabei auf ein Objekt, welches die frisch aufgebaute Verbindung repräsentiert. Mein Problem war nun, dass sobald diese procedure durchgelaufen ist, verschwindet mit dem Free'en des Stacks auch gleichzeitig der Verweis auf die Verbidnung

.
Ich möchte nicht für jedes kleine Datenpaket eine neue Verbidnung zum Server aufbauen. Daher liegt der Schluss nahe, diese Verbindungen zu sichern, und erst dann wieder freizugeben, wenn ich es für nötig halte.
Daher wollte ich einen Thread erstellen, dem ich dieses Verbindungsobjekt übergebe. Erst ,wenn ich den Thread sage er darf ausgehen, wird das Verbinugnsobjekt freigegeben. Während der Thread läuft darf ich mit der Verbinung alles noch machen was ich möchte.
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:
| Type TCP_Thread = class(TThread) public connection : TCustomIpClient; protected procedure Execute; override; end; ------------------------------------------- procedure MyServer.Accept(Sender: TObject; ClientSocket: TCustomIpClient); var i : integer; begin for i := 0 to max_con do begin if connection[i] = nil then begin connection[i] := TCP_Thread.Create(true); connection[i].connection := ClientSocket; connection[i].Resume; break; end; end; end; |
ich habe also ein Array von Threads erstellt "connection[i]", das die Anzahl meiner möglichen Verbindungen darstellt. Wird das On Accept Event ausgelöst so prüfe ich welches der Array Elemente noch auf keine erstelltes Objekt verweist "if connection[i] = nil then". Ist eines gefunden, so wird es erstellt und der von OnAccept erzeugt Verbindungsverweis "ClientSocket" wird ebenfalls dem Thread Übergeben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TCP_Thread.Execute; var data : string; begin while connection.Connected = ture do begin if connection.BytesReceived > 0 then begin data := connection.Receiveln(); end; Sleep(1000); end; end; |
Der Thread sollte nun solange laufen bis die verbindung abgebaut wird "while connection.Connected = ture do". Ob server- oder clientseitiger Abbau ist dabei egal.
Soweit zu der Idee, die nicht funktioniert :-[.
DAS PROBLEM:
Im Thread steht "connection.Connected = ture" nie auf true

.
Meine Vermutung !!!
Ich führe dies auf die Zeile
Delphi-Quelltext
1:
| connection[i].connection := ClientSocket; |
zurück. Vermutlich wird dabei eine Kopie des Objektes erzeugt und dem Thread übergeben. Diese Kopie sieht zwar genauso aus wie das wirkliche Objekt hat aber keiner Verbindung zum Netz. Es ist ein Abbild des Objektes zum dem Zeitpunkt als es kopiert wurde. Die Kopie wird also nie Daten empfangen. Das wahre Objekt scheint mit Beedigung von OnAccept wieder verloren gegangen zu sein.
Auch wenn ich connection als Pointer auf eine Verbindung deklariere und in OnAccept setzte, so verweist es im Thread wieder auf nil :-[.
FRAGE
Wie kann ich der Zerstörung des Verbindungsobjektes entgegen wirken, damit ich nicht immer einer neue Verbidnung aufbauen muss?
Mit freundlichen Grüßen
Tobi