【问题标题】:Client/Server applications communication over the command line with threads c++客户端/服务器应用程序通过命令行与线程 c++ 通信
【发布时间】:2012-11-05 18:58:33
【问题描述】:

我有两个应用程序,一个是客户端,另一个是服务器。服务器将客户端作为子线程启动。然后客户端通过其标准输出输出其命令。服务器等待命令并相应地响应。

基本上客户端服务器通过标准输出。

例如:

client >> Move north
Server >> Your new location is {2,3} 
client >> Move north
Server >> Your new location is {2,2} 
client >> Shoot east 
Server >> Projectile 66638 heading east {3,2}

问题是我不知道如何将这两个应用程序连接在一起,以便服务器读取并响应客户端应用程序。

我想使用命令行作为通信层的原因是我想让客户端的创建尽可能简单。

同时可能有多个客户端,客户端应该能够相互依赖地与服务器通信。 (他们应该看不到彼此的通信)

目前我正在通过CreateProccess() 函数启动应用程序。此功能可以轻松设置应用程序的初始命令行参数。只是没有之后的交流。

我的问题是:

  • 作为线程启动客户端应用程序的服务器应用程序如何读取/写入客户端标准输出?

【问题讨论】:

  • 您需要做的第一件事就是查找how to make a pipe in c++
  • 尝试重定向标准输出是使用命名管道的一种漫长而痛苦的方式。如果您已经使用 CreateProcess(),请使用此 SDK 文章获取指导:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 在使用线程时,您不能真正使用stdout/stdin 作为通信方式。如果您将客户端放在单独的 进程 中,它会起作用,但我不会称之为好的设计。相反,您应该查看其他通信方式,例如管道或套接字。当您的客户端不是您的服务器的一部分时,这将对您有所帮助。
  • 您的问题存在一些歧义...您提到了两个线程(甚至标记为 pthreads,这在 Windows 中通常不可用) CreateProcessCreateProcess 函数创建一个进程而不是线程。
  • 至于设置/获取新进程的标准输入/输出句柄,你检查过STARTUPINFO结构吗?

标签: c++ winapi createprocess


【解决方案1】:

正如上面的评论者所指出的,命名管道(或套接字)是这种解决方案的最佳选择,您可能想要它是两个独立的进程,而不是线程。

在 Windows 中,TransactNamedPipe() 系统调用可帮助您完成所需的工作。它非常适合向服务器发送命令并等待响应,从而可以轻松创建一个客户端,该客户端执行非常类似于对服务器的(同步)远程过程调用。

【讨论】:

  • 我不会创建客户端应用程序。我希望为将要创建客户端的人保持尽可能简单,这就是我希望他们使用标准输出的原因。我担心管道对他们来说太复杂了。我的服务器可以根据需要变得复杂。
猜你喜欢
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多