使用Indy Server的多个绑定作为单独的套接字?

时间:2012-06-07 20:48:49

标签: delphi delphi-xe2 indy indy10

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

我正在重建我的旧系统,该系统使用来自TServerSocket的旧式TClientSocketScktComps组件,并使用Indy TIdTCPServer重新执行此操作。 TIdTCPClient。旧系统实际上由两端完全不同的服务器/客户端套接字组成,每个套接字服务于不同的目的,并且协同工作 - 类似于FTP如何使用一个套接字用于二进制数据而另一个套接字用于命令。

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

1 个答案:

答案 0 :(得分:14)

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

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

INADDR_ANYTIdCPServer.OnConnectTIdCPServer.OnDisconnect事件中,您可以使用TIdCPServer.OnExecuteTIdContext.Binding.IP属性来区分呼叫套接字连接的绑定到。

这种情况的一个常见用途是支持不同端口上的SSL和非SSL客户端,例如POP3和SMTP等协议,这些协议支持不同端口上的隐式和显式SSL / TLS。 TIdContext.Binding.Port这样做是为了支持单个服务器上的TIdHTTPServerHTTP网址(您可以使用HTTPS自定义哪些端口使用SSL / TLS而不是。)

例如:

TIdHTTPServer.OnQuerySSLPort