![]() |
Trivialproblem beim Öffnen eines TClientSocket
Hi allseits,
hin und wieder könnte man an Delphi/WIndows verzweifeln. Wenn immer es eine Möglichkeit gibt, dass triviale Dinge schief gehen, tun sie es auch. Mein abgespeckter Code heute steckt in einem simplen VCL Form, das einen TClientSocket beherbergt, und einen Button. Patscht man auf den Button, wird folgender Code angeschmissen:
Code:
ClientPort und Server liefern eine Port Nummer und eine IP ADresse, auf der anderen Seite lauert eine TServerPort Komponente. Simpel genug, denke ich. Was passiert: drücke ich den Button, wird der Port auf dem Server geöffnet, aber die drei '#' verschwinden im Nirvana. Die Exception triggert nicht. Drücke ich den Button nochmal (und auch jedes weitere Mal) kommen die drei '#' durch. Nehme ich die Abfrage auf .active raus, kommen die drei '#' nie durch, es wird lediglich serverseitig jedes Mal der Socket neu geöffnet.
procedure TClientMainForm.onReloadButtonClick(Sender: TObject);
begin Try if not ClientSocket.Active then // Socket öffnen begin ClientSocket.Port := StrToInt(ReadProgramConfig('CLIENTPORT')); ClientSocket.Host := ReadProgramConfig('SERVER'); ClientSocket.Active := true; end; // Text senden ClientSocket.Socket.SendText('###') Except on e: Exception do ShowMessage(e.ClassName + ' ' + e.Message); End; end; Schätze konkret: in dem Durchlauf, in dem die Routine den Port öffnet, geht der darauffolgende SendText ins Nichts. Muss sie den Port nicht öffnen, weil ich schon mal auf den Button gedrückt hatte, klappt es. Die nahgeliegende Frage: was mache ich falsch? Gruss aus Bayern, Armin. |
AW: Trivialproblem beim Öffnen eines TClientSocket
Steht das
Delphi-Quellcode:
-Property des
ClientType
Delphi-Quellcode:
auf
TClientSocket
Delphi-Quellcode:
?
ctBlocking
|
AW: Trivialproblem beim Öffnen eines TClientSocket
Zitat:
Code:
Also nonblocking. Sollte ich mal blocking probieren? Möchte den Port allerdings nonblocking fahren!
object ClientSocket: TClientSocket
Active = False ClientType = ctNonBlocking Port = 0 OnConnect = ClientSocketConnect OnDisconnect = ClientSocketDisconnect OnRead = ClientSocketRead OnError = ClientSocketError Left = 768 Top = 312 end Fällt mir grad auf ... was auch noch fehlt ist der Code des OnConnect Handlers, vielleicht ist ja der der Bösewicht?
Code:
DisplayMessage schreibt einen Text in die Statuszeile des Forms, in der Form z.B. "Connect: 127.0.0.1:8888", zur Kontrolle. Sollte eigentlich nicht weh tun, oder?
procedure TClientMainForm.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket); begin DisplayMessage('Connect: ' + ConstructPrefix(Socket)); end; Gruss Armin. |
AW: Trivialproblem beim Öffnen eines TClientSocket
Wenn du non-blocking arbeitest, dann ist der Port nach dem Active := true noch nicht offen. Deswegen verschwindet der nachfolgende Send-Befehl im Nirwana.
Bei non-blocking musst du halt mit dem Senden warten, bis der Port wirklich offen ist. Das geht am besten über den OnConnect-Event. Alternativ kannst du auch zyklisch das Active abfragen, das bei non-blocking nämlich trotz des Setzen auf true erst später true zurückliefert. |
AW: Trivialproblem beim Öffnen eines TClientSocket
Zitat:
:-D:-DHabs noch nicht probiert, aber das klingt so schlüssig dass es sicher klappt. Herzlichen Dank!:-D:-D Gruss Armin. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz