我为这个奇怪的问题措辞道歉......这是设计问题:
我正在开发一个服务器(在Linux上使用C ++,FWIW),它为在消费者PC上运行的客户端应用程序的许多实例提供服务。
我想要以下内容:
1)所有客户端首先将自己标识为“网守”服务器应用程序。考虑这是一个登录过程,传递用户名和密码等凭据。调用网守程序“gserver”。 (对于看门人。)
2)一旦验证了每个客户端,就会将其与位于同一服务器地址的同一物理服务器盒上运行的不同服务器应用程序的多个实例之一建立长期连接。调用任何这些实例“wserver”(用于“工作”服务器。)
因此,客户看到的是“网守”应用程序为其提供了对同一个盒子上运行的几个“工作”服务器之一的密码访问。
这是“真正的”挑战:我们希望专门为入站服务器连接使用“众所周知的”端口号(比如端口80或443)。或者,我们自己的“众所周知”端口。
我们宁愿不必让客户端与服务器上的第二个端口通信,以便与wserver(n)建立长期连接阶段。当然,问题在于,一次只能将一个服务器进程绑定到同一个端口和服务器地址。
这意味着客户端与gserver建立的连接也必须充当长期连接的角色。我认为实现这一目标的唯一方法是,gserver在登录后必须像代理一样行动,并将自身和客户端之间的流量复制到客户端逻辑绑定的特定wserver(n)。
如果首先在客户端(n)和gserver之间建立的TCP / IP连接可以某种方式“传输”到同一服务器上的另一个应用程序,完好无损,然后可以由其中一个wserver维护(n )长期连接的实例。
我知道Web服务器会做这样的事情来分散服务器负载。 “负载均衡”。这里的主要区别在于“平衡”是特定用户对特定wserver(n)实例的分配。但我也有这样的印象:负载平衡是一种代理 - 我试图避免(因为它使架构复杂化并增加了开销以及单点故障。)
这是一个概念和设计问题。不要担心源代码示例,除非它们对于获取想法绝对必要。如果我们确定方法,我可以编码。
谢谢!
答案 0 :(得分:4)
您要找的是file descriptor passing。见UNP 15.7。该设施的一个众所周知的重度用户是postfix。
答案 1 :(得分:2)
我很久以前开发了这样的应用程序。由于多个服务器无法侦听同一端口。你需要的是让gserver在众所周知的端口上进行监听。建立连接后,通过Unix套接字将连接传递给其他服务器。一旦连接传递给其他服务器,gserver就会失效。它可能会死,其他服务器仍然可以提供连接。
答案 2 :(得分:0)
我不知道这是否适用于您的设计,但通常的解决方案(由xinetd守护程序实现)是fork()然后exec()进程。例如,xinetd可以提供rlogin,rsh,tftp,telnet等服务,这些服务实际上由不同的程序提供服务。如果您的wservers是已经在系统中运行的进程,那么这对您没有用。