6

私はまだIndyに慣れており、膨大な機能を備えたマルチスレッドソケットシステムです。私が見た大きなことの1つは、サーバーソケットがさまざまなバインディングを持つことができる方法です。たとえば、同じIPアドレスの3つのポートに3つのバインディングを設定できます。DelphiXE2でIndy10を使用しています。

私は、昔ながらTServerSocketTClientSocketコンポーネントを使用する古いシステムを再構築ScktCompsし、IndyTIdTCPServerとでそれをやり直していTIdTCPClientます。古いシステムは、実際には両端に3つの完全に異なるサーバー/クライアントソケットで構成されており、各ソケットは異なる目的を果たし、連携して機能します。これは、FTPが1つのソケットをバイナリデータに使用し、もう1つのソケットをコマンドに使用する方法と似ています。

これらのバインディングを使用して、同じコンポーネント内の3つの別々のサーバー/クライアントソケットを模倣することは可能ですか?サーバー上の3つの異なるポートに接続された、3つのポートがバインドされ、クライアント上で同じサーバーソケットを1つだけ宣言できれば素晴らしいと思います。私がやりたいのは、3つの別々のサーバー/クライアントソケットコンポーネントを作成し、それらを1つに結合する必要をなくすことです。

4

1 に答える 1

14

はい、単一の を使用して一度TIdTCPServerに複数のポートを管理できます。ただし、クライアント側では、異なるポートに接続するために 3 つの異なるクライアント コンポーネントが必要です。

TIdTCPServer.Bindingsリッスンするローカル IP/ポートごとに 1 つずつ、コレクションに 3 つのエントリを作成します。ここで、TIdSocketHandle.Portプロパティはプロパティと同等になりTServerSocket.Portます。 TServerSocketは、特定の IP へのバインドをネイティブにサポートしていません (手作業で行うことはできますが) が、TIdSocketHandle.IPプロパティはその目的で使用されます。ここで、空白の文字列はINADDR_ANY.

TIdCPServer.OnConnectTIdCPServer.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;
于 2012-06-08T00:19:36.303 に答える