![]() |
Indy TIdTCPClient verwenden, aber EIdSocketError?
Hallo,
Wo finde ich ein Einsteigerfreundliches Tutorial zu den Indys. Die Originaldokus sind zu viel auf einmal. Ich glaube, in der DP was von Indy-Eisteigertutorial gesehen zu haben, finde das aber nicht mehr wieder. Kann bitte mal jemand da hin verlinken? ich beschäftigen mich gerade mit den Kommunikationsmöglichkeiten zwischen verschiedenen Anwendungen. So experimentiere ich gerade mit den Indys und habe da folgenden Code:
Delphi-Quellcode:
Mein Problem ist jetzt, das ich beim Verbinden einen ESocketError erhalte. Meldung "Connection timed out".
type
TTCPClient = class(TForm) procedure btnTCPIPConnectClick(Sender: TObject); procedure btnSendClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure Connect; public end; implementation procedure TTCPClient.FormCreate(Sender: TObject); begin FClient := TIdTCPClient.Create(self); FClient.BoundIP := '127.0.0.1'; FClient.BoundPort := 2230; FClient.Port := 2230; FClient.Host := '127.0.0.1'; end; procedure TTCPClient.Connect; begin FClient.Connect; end; procedure TTCPClient.btnTCPIPConnectClick(Sender: TObject); begin Connect; end; procedure TTCPClient.btnSendClick(Sender: TObject); begin FClient.IOHandler.WriteLn('Ein Server Kommando'); end; procedure TTCPClient.FormDestroy(Sender: TObject); begin FClient.DisconnectNotifyPeer; FClient.Free; end; Wenn ich irgendwo eine Mindestzeit vorgeben muss, wieviel Zeit ist da optimal? Ich habe keinen Timeout vorgegeben. Kann es sein, das der Client somit den angebenen Port sucht, aber zu viele Millisekunden dazu braucht. Mehr als die evtl. Defaulteinstellung? Oder ist gar kein Defaultwert vorgegeben? An dieser Stelle habe ich den folgenden Quelltext gefunden:
Delphi-Quellcode:
den ich nicht unkritisch übernehmen will. Deshalb habe ich folgende Fragen:
procedure TForm1.FormShow(Sender: TObject);
begin IdTCPClient1.Host:='127.0.0.1'; IdTCPClient1.Port:=47110; IdTCPClient1.Connect; end; procedure TForm1.Button1Click(Sender: TObject); var s : string; begin IdTCPClient1.IOHandler.WriteLn(Edit1.Text); s:=IdTCPClient1.IOHandler.ReadLn; Memo1.Lines.Add('Client received : '+s); end; Was bedeuten BoundIP und BoundPort? Im letzteren Quelltext wurden nur Host und Port eingestellt. Ist das generell so zu machen, wenn ich eine Verbindung zum Server bauen will. Bei der IP könnte ich noch verstehen, zwei vesrschiedene Werte einzugeben: -Host -> eigener likaler Rechner -BoundIP -> IP des entfernten Rechners Ist das auch so? Aber warum dann auch BoundPOrt. Geht eine Verbindung nicht für schreiben und lesen über ein und denselben Port? Und es gibt ja auch den IdTCPServer, den ich jetzt noch gar nicht beachtet habe, weil ich einstweilen hiermit experimentiere. Dort müsste ja ein von mir gesendetes Break Kommando ankommen, was ich auf dem gdb Bildschirm ja sehen müsste. Da hab ich mir den Server mit der Indy Komponente erst mal geschenkt, weil der unten sthende Server ja auf jeden Fall funktionieren dürfte, womit der Fehler eindeutig meinem Client zuzuordnen wäre. gdbserver 127.0.0.1:2230 <lw:>\meinTestprg.exe gdb -ex "target remote 127.0.0.1:2230" Was muss ich also im Clint einstellen, um die Verbindung zu erhalten? Client uns Server befinden sich auf dem lokalen Rechner |
Re: Indy TIdTCPClient verwenden, aber EIdSocketError?
Host und Port sind die Einstellungen für den Server, den du erreichen willst. in deinem Fall sind das
127.0.0.1:2230 BoundIP und BoundPort ist quasi deine Absenderadresse. Da kannst du dir eine raussuchen, wenn du nix angibst sucht Windows etwas für dich raus. |
Re: Indy TIdTCPClient verwenden, aber EIdSocketError?
Zitat:
Habe die BoundPort und BoundIP ZUweisung jetzt entfernt aber ehalte den ESocketError noch immer. Habe den gdbserver probeweise deaktiviert und so läuft nur noch gdb. Aber der ESocketError bleibt. Wenn ich aber einen TIdTCPServer verwenden will, vermisse ich die Möglichkeit, eine IP Adresse vorzugeben und ich weiß auch nicht, wie ich den Port dort definiere. Da sich aber der GDB mit oder ohne gdbserver bis jetzt nicht ansprechen lässt, würd ich doch gerne einen Indy Server zum Testen nehmen. Es sei denn es wäre mit dem Gespann gdb und gdbserver letzlich doch leichter, weil ich da schon mal einen funktionierenden Server hätte. Mein Ansatz für den Server:
Delphi-Quellcode:
Nur klappt das so nicht. Wo war noch mal die Einsteigerdoku? Will da gleich selber noch mal schauen.
type
TIndyServer = class(TForm) pServer: TMemo; //Meldungen, Kommandos und Nachrichten vom Client empfangen procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure ShowMessageIfConnected; procedure ReceiveMessage; public end; implementation procedure TIndyServer.FormCreate(Sender: TObject); begin FServer := TIdTCPServer.Create(self); FServer.OnConnect := ShowMessageIfConnected; end; procedure TIndyServer.FormDestroy(Sender: TObject); begin FServer.Disconnect; FServer.Free; end; procedure TIndyServer.ShowMessageIfConnected; begin ShowMessage('Verbindung mit Client geglückt!'); end; procedure TIndyServer.ReceiveMessage; begin pServer.Lines.Add(FServer.Readings); //Pseudocode, soll zeigen, was ich machen will end; Wegen dieser Problematik wollte ich zunächst nur den Client machen und für den Server einen bereits funktionierenden nehmen. Aber damit klappt es auch nicht. Wer kann mir hier weiter helfen? . |
Re: Indy TIdTCPClient verwenden, aber EIdSocketError?
Keine Ahnung, warum dein Client einen Fehler hat, meiner verbindet sich hervorragend (Indy9) zu einem von mir geschriebenen Server (nicht Indy)
Delphi-Quellcode:
Wie du bei deinem Server eine Adresse angibst?
procedure TForm1.FormCreate(Sender: TObject);
begin FClient:=TidTCPClient.Create(self); FClient.Host:='127.0.0.1'; FClient.Port:=12000; //kann man angeben ist aber meist völlig unnötig FClient.BoundPort:=13000; FClient.BoundIP:='0.0.0.0'; end; procedure TForm1.FormDestroy(Sender: TObject); begin FClient.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin FClient.Connect; end; procedure TForm1.Button2Click(Sender: TObject); begin FClient.WriteLn('Hallo'); end; Entweder du gibst DefaultPort vor (dann bekommst du deinen Server an alle Netzwerkadapter und den entsprechenden Port gebunden; ist die einfachere Variante), oder gehst über Bindings und gibst diverse Netzwerkadapter vor. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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