6

我还在习惯 Indy,它是一个功能强大的多线程套接字系统。我见过的一件大事是服务器套接字如何具有许多不同的绑定。例如,您可以对同一 IP 地址上的 3 个端口进行 3 个绑定。我在 Delphi XE2 上使用 Indy 10。

我正在重建我的一个旧系统,它使用老式的TServerSocket组件TClientSocketScktComps并使用 IndyTIdTCPServerTIdTCPClient. 旧系统实际上在每一端由 3 个完全不同的服务器/客户端套接字组成,每个套接字都有不同的用途,并且协同工作 - 类似于 FTP 如何使用一个套接字来存储二进制数据而另一个套接字用于命令。

是否可以使用这些绑定在同一组件中模拟三个单独的服务器/客户端套接字?如果我可以只声明一个绑定了 3 个端口的服务器套接字,并且在客户端上相同,连接到服务器上的 3 个不同端口,那就太好了。我想做的就是消除创建 3 个单独的服务器/客户端套接字组件并将它们组合成一个的需要。

4

1 回答 1

14

是的,您可以一次使用一个TIdTCPServer来管理多个端口。但是,在客户端,您仍然需要 3 个不同的客户端组件来连接到不同的端口。

在集合中创建 3 个条目TIdTCPServer.Bindings,一个用于您要侦听的每个本地 IP/端口,其中TIdSocketHandle.Port属性将是该属性的等效项TServerSocket.PortTServerSocket本身不支持绑定到特定 IP(尽管可以通过一些手动工作来完成),但该TIdSocketHandle.IP属性用于此目的,其中空白字符串等同于INADDR_ANY.

TIdCPServer.OnConnectTIdCPServer.OnDisconnectTIdCPServer.OnExecute事件中,您可以使用TIdContext.Binding.IPTIdContext.Binding.Port属性来区分调用套接字连接到哪个绑定。

它的一个常见用途是支持不同端口上的 SSL 和非 SSL 客户端,例如支持不同端口上的隐式和显式 SSL/TLS 的协议(如 POP3 和 SMTP)。 这样做是为了在单个服务器上TIdHTTPServer支持HTTP和url(您可以使用 来自定义哪些端口使用 SSL/TLS 与不使用)。HTTPSTIdHTTPServer.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 回答