はい、単一の を使用して一度TIdTCPServerに複数のポートを管理できます。ただし、クライアント側では、異なるポートに接続するために 3 つの異なるクライアント コンポーネントが必要です。
TIdTCPServer.Bindingsリッスンするローカル IP/ポートごとに 1 つずつ、コレクションに 3 つのエントリを作成します。ここで、TIdSocketHandle.Portプロパティはプロパティと同等になりTServerSocket.Portます。 TServerSocketは、特定の IP へのバインドをネイティブにサポートしていません (手作業で行うことはできますが) が、TIdSocketHandle.IPプロパティはその目的で使用されます。ここで、空白の文字列はINADDR_ANY.
、TIdCPServer.OnConnect、TIdCPServer.OnDisconnectおよびイベントでは、およびプロパティをTIdCPServer.OnExecute使用して、呼び出し元のソケットが接続されているバインディングを区別できます。TIdContext.Binding.IPTIdContext.Binding.Port
これの一般的な用途は、異なるポートで暗黙的および明示的な SSL/TLS をサポートする POP3 や SMTP などのプロトコルなど、異なるポートで SSL クライアントと非 SSL クライアントをサポートすることです。 単一のサーバーでURLTIdHTTPServerをサポートするためにこれを行います (を使用して、 SSL/TLS を使用するポートと使用しないポートをカスタマイズできます)。HTTPHTTPSTIdHTTPServer.OnQuerySSLPort
例えば:
procedure TForm1.StartButtonCick(Sender: TObject);
begin
IdTCPServer1.Active := False;
IdTCPServer1.Bindings.Clear;
with IdTCPServer1.Bindings.Add do
begin
IP := ...;
Port := 2000;
end;
with IdTCPServer1.Bindings.Add do
begin
IP := ...;
Port := 2001;
end;
with IdTCPServer1.Bindings.Add do
begin
IP := ...;
Port := 2002;
end;
IdTCPServer1.Active := True;
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
case AContext.Binding.Port of
2000: begin
// do something...
end;
2001: begin
// do something else...
end;
2002: begin
// do yet something else ...
end;
end;
end;