1

我为奇怪的问题措辞道歉......这是设计问题:

我正在开发一个服务器(在 Linux 上使用 C++,FWIW),它为在消费者 PC 上运行的客户端应用程序的许多实例提供服务。

我想要以下内容:

1) 所有客户端首先向“看门人”服务器应用程序标识自己。考虑这是一个登录过程,其中传递了用户名和密码等凭据。调用网守程序“gserver”。(用于看门人。)

2) 一旦每个客户端都经过验证,然后将其置于与在绑定到相同服务器地址的同一物理服务器盒上运行的不同服务器应用程序的多个实例之一的长期连接中。将这些实例中的任何一个称为“wserver”(用于“工作”服务器。)

因此,客户端看到的是“看门人”应用程序为其提供了对在同一机器上运行的多个“工作”服务器之一的密码访问。

这是“真正的”挑战:我们希望专门为入站服务器连接使用“众所周知的”端口号(比如端口 80 或 443),或者,我们自己的“众所周知的”端口。

在与 wserver(n) 的长期连接阶段,我们宁愿不必让客户端与服务器上的第二个端口通信。当然,这样做的问题是一次只能将一个服务器进程绑定到相同的端口和服务器地址。

这意味着客户端与 gserver 建立的连接也必须充当长期连接的角色。我认为完成此操作的唯一方法是 gserver 必须在登录后充当代理并将其自身与客户端之间的流量复制到客户端逻辑绑定到的特定 wserver(n)。

如果首先在 client(n) 和 gserver 之间建立的 TCP/IP 连接可以以某种方式“传输”到同一服务器上的另一个应用程序,并且完好无损,然后可以由其中一个 wserver(n) 实例维持长期联系。

我知道网络服务器会做这样的事情来分散服务器负载。“负载均衡”。这里的主要区别在于“平衡”是将特定用户分配给特定 wserver(n) 实例。但我也觉得负载平衡是一种代理——我试图避免这种情况(因为它使架构复杂化并增加了开销以及单点故障。)

这是一个概念和设计问题。不要担心源代码示例,除非它们对于传达想法是绝对必要的。如果我们确定一种方法,我可以编写代码。

谢谢!

4

3 回答 3

4

您正在寻找的是文件描述符传递。见 UNP 15.7。这个工具的一个著名的重度用户是postfix

于 2009-12-08T04:04:04.187 回答
2

我很久以前就开发过这样的应用程序。由于多个服务器不能在同一个端口上侦听。您需要让 gserver 监听众所周知的端口。建立连接后,通过 Unix 套接字将连接传递给其他服务器。一旦连接被传递到其他服务器,gserver 就不存在了。它可能会死掉,而另一台服务器仍会为连接提供服务。

于 2009-12-08T04:08:14.367 回答
0

我不知道这是否适用于您的设计,但通常的解决方案(由 xinetd 守护程序实现)是 fork() 然后 exec() 进程。例如,xinetd 可能提供服务,如 rlogin、rsh、tftp、telnet 等,这些服务实际上由不同的程序提供服务。如果您的 wserver 是系统中已经运行的进程,这对您没有用处。

于 2009-12-08T04:04:33.327 回答