如何在与diff机器上的多个客户端连接的服务器中管理应用程序的多个实例

时间:2011-05-18 00:53:54

标签: c windows networking client-server

我的应用程序需要与远程计算机上的客户端配对。可以在服务器上运行此应用程序的多个实例,每个实例服务于不同的客户端,可能多达25-30对。

每对服务器 - 客户端都需要有两个tcp连接。服务器应用程序有2个进程,每个进程都有自己的客户端tcp连接。

  • 进程A与客户端交换命令
  • 进程B从客户端接收恒定的视频流。

此外,每对Process A / Process B之间还有另一个tcp连接

命令/数据将如下所示:

客户< - >过程A< --->进程B

虽然视频会朝这个方向流动:

客户 - >进程B

我需要帮助来确定建立所有tcp连接的最佳方法是什么。谁设立了听众?如何确定要使用的端口?等

我目前有一个进程A的实例与进程B和客户端通信,但它都在一台机器上运行,所以我现在只使用“localhost”作为我的主机名。我也在硬编码我正在使用的2个端口,所以当我有多个实例时,我需要更改它,以便每个实例使用不同的端口。

一旦进程A与客户端建立连接,它就需要向客户端询问端口,以便进程B可以直接与客户端建立另一个连接。这是一个很好的方法吗,或者更好的方法是什么?客户端如何确定可以使用的端口?

还有任何关于如何分配端口的帮助或指示,以便可以使用多个实例。

谢谢,请询问任何不清楚的问题。

编辑:实际上,流程A和流程B是两个不同的应用程序。

1 个答案:

答案 0 :(得分:0)

我对应用程序知之甚少,所以可以进一步简化,但我会做以下事情:

  • 创建一个或两个侦听已知端口的服务器进程(您可能会将其缩减为一个,但如果您需要两个,那么我将解释如何执行此操作)。

  • 如果您可以将其转移到单个服务器进程,它可以侦听两个端口本身。使用select调用,您可以监视每个打开的文件描述符上的活动。事实上,这就是为什么我认为你可以用一个过程或一小部分过程完成整个过程。

  • 让客户端连接到服务器上的已知端口。当您进入远程网络时,让服务器连接到客户端会给您带来麻烦。您可以随时通过端口转发或在DMZ中获取服务器,但您不能坚持要求所有客户端更改其网络以删除NAT,禁用防火墙或转发应用程序的端口。

  • 当客户端连接时,如果您需要多个进程,请在分叉之前让服务器建立为彼此的开放连接,以便您可以使用已知端口连接它们。

  • 如果您需要单独的流程,请使用fork拆分流程。在子进程中,关闭正在侦听已知端口的文件描述符。在父进程中,除了连接到其他服务器进程的文件描述符之外,还要关闭连接到客户端的文件描述符。

注意:这是来自linux的背景,但我很确定所有这些函数和方法都可以在windows上运行。如果我错了,我相信有人会纠正我。我强烈建议您尝试使用select将其归结为一个简单的编码过程。如果您需要更好地使用多处理器系统,那么请使用多线程或拥有一系列流程来权衡连接处理。如果您需要创建多个流程,了解文件描述符在fork之后如何工作将简化您的编码。