gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:56:53 28 4
gpt4 key购买 nike

我还在习惯 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com