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

标签 c windows networking client-server

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

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

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

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

命令/数据将从以下流出:

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

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

客户端-->进程B

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

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

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

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

谢谢,有什么不明白的地方欢迎提问。

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

最佳答案

我对应用程序了解不够,所以这可能会进一步简化,但我会执行以下操作:

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

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

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

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

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

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

关于c - 如何在与不同机器上的多个客户端连接的服务器中管理应用程序的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038767/

相关文章:

c - 使用 mosquitto API 实现 mqtt 协议(protocol)

C 程序读取和存储字符串

windows - 捕获特定文件夹中的临时文件创建

web-services - 是否可以在不使用他们的 Web 服务的情况下以编程方式访问 Sabre?

c++ - 编写 Virtualbox 脚本以创建网络

c - 为什么多个 if 语句比执行 while 循环更快?

c - 何时对结构使用指针与直接成员

windows - 如何知道 Windows 中 sox 的事件音频设备

windows - 使用 SQLEXPRWT_x86_ENU.exe 从命令行安装 SQL Server Express 2008 R2 时,我应该为 SQLSVCACCOUNT 参数使用什么值?

java - 最佳实践 : network communication