【问题标题】:Network library in C++C++ 中的网络库
【发布时间】:2013-03-07 11:24:59
【问题描述】:

我将在 Windows 上运行 C++ 中的客户端/服务器应用程序,服务器本身由“管理器”可执行文件组成,生成一次,“工作人员”可执行文件生成 1 到 29 次,具体取决于配置。

coms 位于客户端和“管理器”进程之间、“管理器”进程和“工作”进程之间(配置它们、将数据发送到进程)以及一些“工作”进程之间。 附带说明:当我说工作进程时,我并不是指进程并行执行完全相同的工作以获得超级性能:它们的配置都不同,做不同的工作,性能真的不是问题。这里的几个过程的分离更多是为了稳定性。

现在我不知道该选择哪个网络库来完成所有这些工作。

我知道 boost::asio,我对 boost 及其独特的风格很熟悉,但恐怕我团队的其他成员不熟悉。 我还被建议使用 zeroMq。 我已经看到了其他一些人的优点和缺点。但是我有点迷茫!

对于 zeroMq,我认为我们失去了 asio 的 proactor?所以从某种意义上说它感觉它是低级的? 另一方面,它提供了我认为对我们没有用的发布/订阅等功能。

这些库都不会帮助我们处理序列化部分(交换的数据是异构的)。我在想 google 协议缓冲区可以在这一点上帮助我们,除非周围有一个 do it all 库?

我们隐约考虑过的其他选择是 Corba、amqp。前者感觉笨拙,我们被建议不要这样做。后者感觉过于复杂。 (?)

有什么建议吗?

【问题讨论】:

  • 虽然我没有任何积极的建议(我一直使用我自己的网络库),但我可以告诉你要避免什么:绝对避免使用 CORBA,也避免使用 ACE,这太糟糕了。 :)
  • 你考虑过 gsoap 吗?它是一种广泛用于基于肥皂的架构
  • @James 感谢您的输入,我忘了提及 ACE。我过去确实使用过它,但在这里并没有真正考虑过。
  • @Pradheep 我会调查一下谢谢 :)
  • 您团队中的其他成员熟悉哪些内容?如果他们都必须学习新的东西,那么至少你个人已经熟悉 asio。否则团队的所有成员都在新的领域。

标签: c++ network-programming boost-asio zeromq


【解决方案1】:

ZeroMQ works just fine 与 Boost.Asio 集成,如果您选择走这条路的话。也就是说,如果你熟悉的话,我建议你使用 Boost.Asio 来实现你的客户端和服务器。这是一个编写精美的库,文档齐全,如果您有任何问题,它还有一个活跃的用户社区(即我们)。

根据我的经验,大多数倾向于回避 Asio 的开发人员不熟悉非阻塞 I/O,并且更喜欢使用每个连接线程的方法来孤立他们的设计,这种方法不会扩展到琐碎的示例之外。将您的同事指向Asio examples,将他们发送到 StackOverflow,以便他们阅读 标签中的问题。如果他们仍然不相信,也许可以向他们展示基于 Asio 的 TR2 networking library 提案,它可能有一天会成为标准。

【讨论】:

  • 说得好! Boost.Asio 提供了一个干净且有据可查的 C++ 工具包,可以与各种中间件集成。即使我只是将它用作底层中间件的抽象,我也很难放弃。
【解决方案2】:

使用 ZMQ,您可能希望使用发布/订阅模型(与 zmq 2.2 相比,在 zmq 3.x 中特别有效,因为 3.x 执行基于发布的订阅过滤,而 2.2 执行基于客户端的过滤)。

所有工作人员都将使用 SUB 套接字连接到管理器(不管他们是什么类型的工作人员)并订阅它需要处理的消息。管理器将绑定一个 Pub 套接字并推送它从客户端接收到的所有消息。工作人员只会收到它订阅的消息。这是非常有效的,老实说,这是我实现这种行为的方式。

如果您有多个工作人员处理相同的消息(出于性能考虑),您需要创建一个中间“工作人员”来订阅该特定消息类型并绑定一个 PUSH 套接字,相同类型的工作人员将使用 PULL 套接字连接到该中间“工作人员”(也称为路由器)。这样,传入的消息将被“排队”并在每个工作人员完成一项任务时散开。

我可能会从一开始就创建中间步骤,这样您就可以在没有太多问题的情况下扩展开箱即用(如果真的需要的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多