C++ 服务器应用程序框架(最好使用BOOST C+;+;)

C++ 服务器应用程序框架(最好使用BOOST C+;+;),c++,boost,C++,Boost,我正在考虑编写一个服务器应用程序——类似于mySQL或Apache 主要要求是: 客户端将通过TCP/IP(套接字)与服务器通信 服务器将产生一个新的子进程来处理请求(ala Apache) 理想情况下,我希望使用BOOST库,而不是尝试重新创建自己的库。一定有代码在某个地方完成了我想做的大部分工作-所以我可以使用它(或者至少是它的一部分作为我的起点),有人能给我指出一个有用的链接吗 在没有代码可以作为起点的情况下(希望不太可能),有人能指出最适合使用的BOOST库吗?以及如何处理的一般指南 我

我正在考虑编写一个服务器应用程序——类似于mySQL或Apache

主要要求是:

  • 客户端将通过TCP/IP(套接字)与服务器通信
  • 服务器将产生一个新的子进程来处理请求(ala Apache)
  • 理想情况下,我希望使用BOOST库,而不是尝试重新创建自己的库。一定有代码在某个地方完成了我想做的大部分工作-所以我可以使用它(或者至少是它的一部分作为我的起点),有人能给我指出一个有用的链接吗

    在没有代码可以作为起点的情况下(希望不太可能),有人能指出最适合使用的BOOST库吗?以及如何处理的一般指南

    我主要担心的是如何知道其中一个孩子什么时候坠毁了。好吧,有两种方法可以做到这一点:

  • 在父母和孩子之间使用心跳(这很快就会变得混乱,并引入更多可能出错的事情)
  • 不知何故,用一个timeout参数包装进程的生成过程——但这是一种愚蠢的方法,因为如果一个子进程正在执行时间密集型工作,那么父进程可能会错误地认为该子进程已经死亡
  • 让父母知道孩子已经死亡的最佳做法是什么

    [编辑]

    顺便说一句,我正在Linux上开发/运行/部署

    使用线程(受Boost支持)而不是分叉进程怎么样?这将允许您查询子线程的状态,而且线程比分叉更容易处理。

    我可以肯定地说,这是您唯一稳定的选择。
    我从未使用过它,但我打算使用,而且API看起来非常干净

    对于Boost库,您需要:

    • 助推,助推
    • 推进。线程
    • Spirit(或类似于解析HTTP协议的东西)
    • Boost.IPC
    在什么平台上(Windows/Linux/两者)?Windows上的进程被认为比Linux更重,因此您可能会考虑线程。

    另外,我认为最好(像Apache一样)不要为每个请求生成一个进程,而是有一个进程池,这样可以节省创建进程的成本,特别是在Windows上


    如果您使用的是Linux,
    waitpid()
    对您有用吗?您可以在非阻塞模式下使用它,每隔一段时间反复检查是否有一个子进程终止。Asio是一个很好的起点

    但有几点需要注意:

  • Asio是一个很好的库,但它不是很有fork意识,所以不要尝试共享Asio 多个fork进程之间的事件循环-这将不起作用(即-如果
    boost::asio::io_服务
    是在fork之前创建的-不要在fork之后的多个进程中使用它)

    此外,它不允许您从
    boost::asio::XX::socket
    所以,唯一的方法是调用dup,然后将其传递给子进程

    但是说实话?我认为您不会找到任何网络事件循环库 fork-aware(可能除了我写的CppCMS的booster.aio之外) 我自己知道)

  • 等待子项非常简单,您可以使用
    sigaction
    在发送的
    SIGCHLD
    信号上,然后子系统崩溃或退出。 所以你所需要做的就是处理这个信号,然后在主循环中调用waitpid 收到信号

    使用asio,您可以使用“自管道”技巧从信号处理程序将循环从睡眠中唤醒

  • 首先,看一看。它可能已经适合你的需要了

    现在,正如其他人所指出的,boost::asio是一个很好的起点,但实际上是任务的基础


    <>你可能会对基于Boosi::ASIO:(在一次Boost中提交的)的服务器代码更感兴趣。

    < P>我已经用一种模块化的方式制作了一个用于创建C++应用程序的FOS库。它是在

    这是我的博客:

    它特别适合于创建通用服务器(这是我构建它的动机),但我认为它可以用于任何类型的应用程序


    必须与最终二进制文件一起部署的部分是LGPL,因此它可以用于商业应用程序。

    我不知道您使用的是什么系统,但在Posix系统中,当子系统出于任何原因终止时,父系统会收到一个信号。顺便说一句,在很长一段时间内,为每个连接分叉子进程都不是最先进的技术。它是在Google V8 JavaScript引擎上实现的。我得说它看起来很有前途!Node.js似乎有非常好的响应时间。调试can-MT应用程序很容易变成一场噩梦(至少在我的经验中是这样)。2.健壮性:我不希望一个孩子意外终止服务器,使服务器崩溃。在我看来,你将很难通过这里的线程。每个连接的生成进程将无法扩展。避免共享状态,你的机器翻译不会打扰你。进程池的想法(如davka建议)是非常合理的。事实上,我喜欢进程池的想法(现在为什么我没有想到!)π介子确实看起来很有前途。Boost.IPC是什么?我可以在boost网站上找到它。我可能确实需要一个IPC框架