AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Trivialproblem beim Öffnen eines TClientSocket
Thema durchsuchen
Ansicht
Themen-Optionen

Trivialproblem beim Öffnen eines TClientSocket

Ein Thema von Nimral · begonnen am 18. Jun 2015 · letzter Beitrag vom 19. Jun 2015
Antwort Antwort
Nimral

Registriert seit: 21. Sep 2005
18 Beiträge
 
#1

Trivialproblem beim Öffnen eines TClientSocket

  Alt 18. Jun 2015, 22:33
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:
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;
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.

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.

Geändert von Nimral (18. Jun 2015 um 22:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Trivialproblem beim Öffnen eines TClientSocket

  Alt 18. Jun 2015, 22:54
Steht das ClientType -Property des TClientSocket auf ctBlocking ?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nimral

Registriert seit: 21. Sep 2005
18 Beiträge
 
#3

AW: Trivialproblem beim Öffnen eines TClientSocket

  Alt 18. Jun 2015, 23:29
Steht das ClientType -Property des TClientSocket auf ctBlocking ?
Hi Uwe,

Code:
  object ClientSocket: TClientSocket
    Active = False
    ClientType = ctNonBlocking
    Port = 0
    OnConnect = ClientSocketConnect
    OnDisconnect = ClientSocketDisconnect
    OnRead = ClientSocketRead
    OnError = ClientSocketError
    Left = 768
    Top = 312
  end
Also nonblocking. Sollte ich mal blocking probieren? Möchte den Port allerdings nonblocking fahren!

Fällt mir grad auf ... was auch noch fehlt ist der Code des OnConnect Handlers, vielleicht ist ja der der Bösewicht?

Code:
procedure TClientMainForm.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
  begin
  DisplayMessage('Connect: ' + ConstructPrefix(Socket));
  end;
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?

Gruss Armin.

Geändert von Nimral (18. Jun 2015 um 23:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Trivialproblem beim Öffnen eines TClientSocket

  Alt 19. Jun 2015, 09:48
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nimral

Registriert seit: 21. Sep 2005
18 Beiträge
 
#5

AW: Trivialproblem beim Öffnen eines TClientSocket

  Alt 19. Jun 2015, 11:16
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.
Hi Uwe,

Habs noch nicht probiert, aber das klingt so schlüssig dass es sicher klappt. Herzlichen Dank!

Gruss Armin.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 16:56 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