AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi ClientSocket bekommt keine Verbindung
Thema durchsuchen
Ansicht
Themen-Optionen

ClientSocket bekommt keine Verbindung

Ein Thema von UliBru · begonnen am 5. Jan 2013 · letzter Beitrag vom 6. Jan 2013
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: ClientSocket bekommt keine Verbindung

  Alt 5. Jan 2013, 17:06
Unit ScktComp.pas in Projektverzeichnis kopieren und ins Projekt aufnehmen.
(Ggf. muss uses System.Win.ScktComp -> uses ScktComp geändert werden)
Danach kann man auf if Client.Active then einen Breakpoint setzen und per Einzelschritt nachforschen woran es klemmt.

Ausserdem sollte man testen, ob das Problem vielleicht nur bei einer Konsolenanwendung besteht.
Sockets melden Ereignisse über Windows Messages; da es bei Konsolenanwendungen keine Messageloop gibt wäre es denkbar, dass dies ein Problem darstellt.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: ClientSocket bekommt keine Verbindung

  Alt 5. Jan 2013, 18:38
Probiers mal so:
Delphi-Quellcode:
  Client.Open;
  Sleep(1000); // 1 sek
  Application.ProcessMessages;
  if Client.Active then // <-----------------------wird nicht aktiv
Ich glaube, die Komponente ist standardmäßig non-blocking - dh. beim Verbindungsaufbau wird das Programm fortgesetzt. Da liefert dir Active false, da evt. noch nicht erfolgreich verbunden wurde.
Das dauert im Schnitt einige Sekunden...
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 5. Jan 2013 um 20:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: ClientSocket bekommt keine Verbindung

  Alt 6. Jan 2013, 04:37
Genau das hier trifft zu:
Ich glaube, die Komponente ist standardmäßig non-blocking - dh. beim Verbindungsaufbau wird das Programm fortgesetzt. Da liefert dir Active false, da evt. noch nicht erfolgreich verbunden wurde.
Das dauert im Schnitt einige Sekunden...
Als schnelle Lösung würde ich vorschlagen die Eigenschaft ClientType des Sockets auf ctBlocking zu setzen. Ich sehe bei einer Konsolenanwendung sowieso keinen großen Vorteil in non blocking Sockets.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ClientSocket bekommt keine Verbindung [gelöst]

  Alt 6. Jan 2013, 09:48
Als schnelle Lösung würde ich vorschlagen die Eigenschaft ClientType des Sockets auf ctBlocking zu setzen. Ich sehe bei einer Konsolenanwendung sowieso keinen großen Vorteil in non blocking Sockets.
Das muss ich nochmal testen. Klingt logisch.
In der Zwischenzeit hab ich es mit Indy getestet und das klappt. Never touch a running system ...

Delphi-Quellcode:
  IdTCPClient1 := TIdTCPClient.Create(nil);
  try
    IdTCPClient1.Host := '127.0.0.1';
    IdTCPClient1.Port := 8078;
    IdTCPClient1.Connect;
    if IdTCPClient1.Connected then
    begin
      IdTCPClient1.IOHandler.Write(s);
      IdTCPClient1.Disconnect;
    end;
  except
    on E: Exception do ;
  end;
  IdTCPClient1.Free;
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: ClientSocket bekommt keine Verbindung [gelöst]

  Alt 6. Jan 2013, 10:22
In der Zwischenzeit hab ich es mit Indy getestet und das klappt.

Delphi-Quellcode:
  IdTCPClient1 := TIdTCPClient.Create(nil);
  try
    IdTCPClient1.Host := '127.0.0.1';
    IdTCPClient1.Port := 8078;
    IdTCPClient1.Connect;
    if IdTCPClient1.Connected then
    begin
      IdTCPClient1.IOHandler.Write(s);
      IdTCPClient1.Disconnect;
    end;
  except
    on E: Exception do ;
  end;
  IdTCPClient1.Free;
Man kann das if IdTCPClient1.Connected then ... weglassen, denn wenn der Verbindungsaufbau mit IdTCPClient1.Connected scheitert, wird eine Exception ausgelöst. Die Zeile mit der Abfrage auf Connected würde also nie erreicht.

Sicherheitshalber würde ich das Free in einem finally Block platzieren.


Delphi-Quellcode:
  IdTCPClient1 := TIdTCPClient.Create(nil);
  try
    IdTCPClient1.Host := '127.0.0.1';
    IdTCPClient1.Port := 8078;
    try
      IdTCPClient1.Connect;
      IdTCPClient1.IOHandler.Write(s);
      IdTCPClient1.Disconnect;
    except
      on E: Exception do
      begin
        Log(E);
        raise;
      end;
    end;
  finally
    IdTCPClient1.Free;
  end;
Michael Justin
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ClientSocket bekommt keine Verbindung

  Alt 6. Jan 2013, 11:50
Ich hab nun Client.ClientType := ctBlocking getestet und damit klappt es auch. Das was der ursächliche Grund.
Da sich mit TClientSocket ein kleineres Programm ergibt als mit TIdTCPClient verwende ich nun doch wieder das TClientSocket.

Das Programm sieht nun so aus:
Delphi-Quellcode:
  Client := TClientSocket.Create(nil);
  try
    Client.Host := '127.0.0.1';
    Client.Port := 8078;
    Client.ClientType := ctBlocking;
    try
      Client.Open;
      Client.Socket.SendText(AnsiString(s));
      Client.Close;
    except
      on E: Exception do; //ignore, do nothing
    end;
  finally
    Client.Free;
  end;
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#7

AW: ClientSocket bekommt keine Verbindung

  Alt 6. Jan 2013, 12:20
Ähm, warum nutzt du nicht einfach das Event OnConnect dafür?
Depending on the service, this may be the point when the socket should start reading or writing over the connection.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#8

AW: ClientSocket bekommt keine Verbindung

  Alt 5. Jan 2013, 19:35
Sockets melden Ereignisse über Windows Messages; da es bei Konsolenanwendungen keine Messageloop gibt wäre es denkbar, dass dies ein Problem darstellt.
Und wie funktioniert dann telnet.exe?

Indy und Synapse TCP Clients funktionieren problemlos in Konsole Anwendungen, nur die alten TClient/TServerSockets (asynchron) und andere asynchrone Komponenten wie ICS benötigen die Windows Message Loop, um Gegensatz zu Indy und Synapse (die dadurch auch leichter auf anderen Betriebssystemen einsetzbar sind).

Oft wird aber hier in diesem Zusammenhang 'Sockets' gesagt, aber damit ist dann nicht die allgmein bekannten TCP/IP Sockets, sondern speziell die alten Delphi TClientSocket / TServerSocket Komponenten gemeint.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: ClientSocket bekommt keine Verbindung

  Alt 5. Jan 2013, 23:21
Sockets melden Ereignisse über Windows Messages; da es bei Konsolenanwendungen keine Message Loop gibt wäre es denkbar, dass dies ein Problem darstellt.
Und wie funktioniert dann telnet.exe?
Windows Sockets können Windows Messages versenden (WSAAsyncSelect), müssen aber nicht.
Und Konsolenanwendungen können ein unsichtbares Window + einen Thread erzeugen um die Messages zu empfangen und abzuarbeiten.
Wie das in telnet.exe läuft, weiss ich nicht aber es ein Aspekt der bei asynchronen Sockets beachtet werden sollte.
  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 06:01 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-2025 by Thomas Breitkreuz