delphi - 使用 Indy Server 的多个绑定(bind)作为单独的套接字?

标签 delphi delphi-xe2 indy indy10

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

我正在重建我的旧系统,该系统使用来自 ScktComps 的老式 TServerSocketTClientSocket 组件并重新进行它与 Indy TIdTCPServerTIdTCPClient 一起使用。旧系统实际上由每端 3 个完全不同的服务器/客户端套接字组成,每个套接字都有不同的用途,并且一起工作 - 类似于 FTP 使用一个套接字用于二进制数据,另一个套接字用于命令。

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

最佳答案

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

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

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

此功能的常见用途是在不同端口上支持 SSL 和非 SSL 客户端,例如 POP3 和 SMTP 等协议(protocol)在不同端口上支持隐式和显式 SSL/TLS。 TIdHTTPServer 这样做是为了支持单个服务器上的 HTTPHTTPS url(您可以使用 TIdHTTPServer.OnQuerySSLPort 来自定义哪些端口使用 SSL/TLS,哪些端口不使用)。

例如:

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;

关于delphi - 使用 Indy Server 的多个绑定(bind)作为单独的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10939650/

相关文章:

delphi - 带有NetBeans 7.1.2的Delphi

delphi - 如何在运行时获取包名称/版本

Delphi Indy ReadLn 超时

delphi - TIdTCPServer 或 TIdTCPClient 哪个更适合 pbx 事件?

c++ - XE2 - Indy TCPServer : what is the best way to write and read a listview?

delphi - VirtualTreeView:编辑下一列

windows - 使用提升的权限复制文件

mysql - 如何使用 Delphi 连接到 MySQL 服务器

delphi - 如何在Delphi调用堆栈窗口中隐藏 'non-user'堆栈帧?

multithreading - 管理动态线程数