我还在习惯 Indy,它是一个具有强大功能的多线程套接字系统。我见过的最重要的事情之一是服务器套接字如何拥有许多不同的绑定(bind)。例如,您可以为同一 IP 地址上的 3 个端口进行 3 个绑定(bind)。我在 Delphi XE2 上使用 Indy 10。
我正在重建我的旧系统,该系统使用来自 ScktComps
的老式 TServerSocket
和 TClientSocket
组件并重新进行它与 Indy TIdTCPServer
和 TIdTCPClient
一起使用。旧系统实际上由每端 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.OnConnect
、TIdCPServer.OnDisconnect
和 TIdCPServer.OnExecute
事件中,您可以使用 TIdContext.Binding .IP
和 TIdContext.Binding.Port
属性用于区分调用套接字连接到哪个绑定(bind)。
此功能的常见用途是在不同端口上支持 SSL 和非 SSL 客户端,例如 POP3 和 SMTP 等协议(protocol)在不同端口上支持隐式和显式 SSL/TLS。 TIdHTTPServer
这样做是为了支持单个服务器上的 HTTP
和 HTTPS
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/