![]() |
Delphi-Version: 2009
Indy: Server an Client
Hallo!
Ich habe einen Server der auf verschiedenen Portadressen etwas an den Client sendet. Kann ich im Client mehr als ein Port freigeben und besteht die Möglichkeit für den Client herauszufinden auf welchem Port er gerade etwas erhält? Gruß Major1337 |
AW: Indy: Server an Client
Hallo Major1337,
Bist du dir sicher mit Deiner Beschreibung? Normal verbindet sich ein Client auf einen Server mit einer bestimmten PortAdresse. Willst du also eine Server-Applikation, die auf mehrere Ports lauscht, dann würde ich jetzt einfach mehrere Instanzen von TIDXXXServer nutzten, wobei hier jeder auf einen anderen Port lauscht. Der Client entscheidet dann vor dem Connect was er machen will und verbindet sich dann auf den Port. Beispiel WebServer mit FTPServer auf einer Maschine Port 80 -> Webseitenanfragen Port 21 -> FTP Oder hab ich dich jetzt falsch verstanden? Greez, Chris |
AW: Indy: Server an Client
Hi,
Zitat:
Delphi-Quellcode:
IdTCPClient1.Socket.Binding.PeerPort
Allerdings kann ich mich nur meinem Vorredner anschliessen, ein Client hat immer nur genau eine Connection zu einer IP/PORT Greetz Data |
AW: Indy: Server an Client
Genauergenommen ein Client-Port hat genau eine Verbindung mit einem Server-Port. Der Client kann natürlich mehrere Ports/Verbindungen öffnen
|
AW: Indy: Server an Client
Zitat:
Oder wie? |
AW: Indy: Server an Client
Ja aber unter Client meint man meistens das Programm.
|
AW: Indy: Server an Client
Danke, ich habe jetzt beim Server für jede Port eine Execute gemacht. Jetzt möchte ich mit dem Client eine Portadresse aus der Listbox auswählen - mit der er sich dann verbindet.
Delphi-Quellcode:
// Client procedure TForm1.Button1Click(Sender: TObject); begin if not TCPClient.Connected then TCPClient.Connect else TCPClient.IOHandler.WriteLn(Edit1.Text); end; procedure TForm1.ListBox1Click(Sender: TObject); var i : Integer; begin for i := 0 to ListBox1.Count - 1 do if ListBox1.Selected[i] then TCPClient.Port := StrToInt(ListBox1.Items.Strings[i]); end;
Delphi-Quellcode:
// Server procedure TForm2.FormCreate(Sender: TObject); begin IDTCPServer1.DefaultPort := 10; IDTCPServer1.Active := true; IDTCPServer2.DefaultPort := 20; IDTCPServer2.Active := true; end; procedure TForm2.IdTCPServer2Execute(AContext: TIdContext); begin Memo1.Lines.Add('Port: ' + IntToStr(IDTCPServer2.DefaultPort) + ' ' + acontext.Connection.IOHandler.ReadLN); end; procedure TForm2.IdTCPServer3Execute(AContext: TIdContext); begin Memo1.Lines.Add('Port: ' + IntToStr(IDTCPServer3.DefaultPort) + ' ' + acontext.Connection.IOHandler.ReadLN); end; usw. Beim Server zeigt er mir aber so immer den selben Port an, jetzt weiss ich nicht wenn ich auf einem anderen Port sende, ob er tatsächlich über den Port senden und nur die falsche Portnummer anzeigt. |
AW: Indy: Server an Client
So geht das natürlich nicht :)
Du brauchst, um dich an mehrere Ports zu binden, auch mehrere Instanzen des IDTCPServer. EIN Server bindet sich immer an EINEN Port, willst du mehrere aufmachen, brauchst du mehrere Instanzen. Was ist überhaupt dein Vorhaben, wieso brauchst du mehrere Ports? Im Normalfall reicht eigentlich ein offener Port pro Applikation, ausser du willst, wie ChrisE bereits gesagt hatte, mehrere Server für verschiedene Protokolle aufmachen. Entschuldige mich, wenn ich falsch liege, aber mir kommt es jetzt irgendwie so vor, als würdest du annehmen, für mehrere Clients brauchst du auch mehrere offene Ports am Server. Das stimmt so nicht, du kannst mit einem TCP-Server viele Client-Verbindungen auf einem offenen Port laufen lassen. (Beispiel Webserver: ein Standard-Webserver läuft auf Port 80 (EIN offener Port), aber kann viele Clients bedienen, die sich immer auf Port 80 verbinden) |
AW: Indy: Server an Client
hmm Ich habe doch IDTCPServer1, IDTCPServer2, IDTCPServer3... usw.
|
AW: Indy: Server an Client
Oh, sorry, das habe ich übersehen, aber dann stimmt dein Code irgendwie nicht, du setzte die Ports für Server 1 und 2 (3 nicht), die Execute-Routinen sind aber für 2 und 3? Jetzt bin ich etwas verwirrt.
Was willst du eigentlich genau machen? Falls du einen Server-Port "on the fly" umschalten willst, musst du auch die Bindings des Servers umschalten, die eventuell bereits bestehen:
Delphi-Quellcode:
IdTCPServer2.DefaultPort := 20;
for I := 0 to IdTCPServer2.Bindings.Count-1 do begin IdTCPServer2.Bindings[I].Port := IdTCPServer2.DefaultPort; end; IdTCPServer.Active := True; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 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