はい、単一の を使用して一度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.IP
TIdContext.Binding.Port
これの一般的な用途は、異なるポートで暗黙的および明示的な SSL/TLS をサポートする POP3 や SMTP などのプロトコルなど、異なるポートで SSL クライアントと非 SSL クライアントをサポートすることです。 単一のサーバーでURLTIdHTTPServer
をサポートするためにこれを行います (を使用して、 SSL/TLS を使用するポートと使用しないポートをカスタマイズできます)。HTTP
HTTPS
TIdHTTPServer.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;