【问题标题】:how to manage multiple instances of an app in server connecting with multiple clients on diff machines如何管理服务器中应用程序的多个实例与不同机器上的多个客户端连接
【发布时间】:2011-05-18 00:53:53
【问题描述】:

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

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

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

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

命令/数据将来自如下:

客户端 进程 A 进程 B

而视频将朝这个方向流动:

客户端 --> 进程 B

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

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

一旦进程A与客户端建立连接,它需要向客户端请求一个端口,以便进程B可以直接与客户端建立另一个连接。这是一个好方法,还是更好的方法?客户端如何确定可以使用的端口?

还有关于如何分配端口的任何帮助或指针,以便它可以与多个实例一起使用,我们将不胜感激。

谢谢,有什么不清楚的地方可以问。

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

【问题讨论】:

    标签: c windows networking client-server


    【解决方案1】:

    我对应用程序的了解不够,所以可以进一步简化,但我会做以下事情:

    • 创建一个或两个侦听已知端口的服务器进程(您可能可以将其减少到一个,但如果您需要两个,好的,我会解释如何做到这一点)。

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

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

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

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

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

    【讨论】:

    • 感谢您的 cmets。实际上进程 A 和 B 是两个不同的应用程序,因此没有父/子进程。没有使用叉子。
    • 您说“让客户端连接到服务器上的已知端口”当我运行多个服务器应用程序实例时,这将如何工作。每个实例都需要在不同的端口上。
    • 如果它是两个独立的进程,你将至少有两个已知的端口,proc A 和 B。如果你不能让 proc B 成为一个监听和分叉子进程的进程,那么对于每个 proc B,我会让它用它发现的端口号与 proc A 通信。 proc A 可以将此端口号发送给客户端以进行第二次连接。
    • 要获得一个开放的端口,你可以给 proc B 一个起始端口,并在一个循环中让它尝试绑定/监听,如果失败,返回到循环的顶部并增加端口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2021-08-17
    • 2018-12-05
    相关资源
    最近更新 更多