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

3

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

主要要求如下:

  1. 客户端将通过TCP/IP(套接字)与服务器通信
  2. 服务器将生成一个新的子进程来处理请求(类似于Apache)

理想情况下,我希望使用BOOST库,而不是尝试重新发明我的代码。一定有地方有代码可以做到我所要做的大部分事情 - 所以我可以使用它(或者至少作为起点的一部分) - 有人能否指向一个有用的链接?

如果(希望不太可能)没有可用作起点的代码,有人能指出最合适的BOOST库以使用 - 并提供有关如何继续的一般指南吗?

我主要担心的是如何知道何时其中一个子进程崩溃。据我所知,有两种方法可以做到这一点:

  1. 在父进程和子进程之间使用心跳(这很快变得混乱,并引入了更多可能出错的事情)
  2. 以超时参数包装进程生成 - 但这是一种愚蠢的方法,因为如果子进程正在进行耗时的工作,则父进程可能错误地认为子进程已死亡

哪种方法是让父进程知道子进程已死的最佳实践?

[编辑]

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


2
我不知道你在使用什么系统,但在Posix系统中,父进程会在子进程因任何原因终止时接收到一个信号。另外,顺便说一下,为每个连接派生子进程已经不是现代的做法了。 - cababunga
1
你可能想要了解一下Node.js:http://nodejs.org/。它是基于Google V8 JavaScript引擎实现的。我认为它看起来非常有前途!Node.js似乎具有极好的响应时间。 - Daniel Lidström
6个回答

4
在哪个平台上(Windows/Linux/两者皆可)?在Windows上,进程被认为比Linux上的进程更重量级,因此您可能确实需要考虑使用线程。
另外,我认为最好像Apache一样不为每个请求生成一个进程,而是拥有一个进程池,这样可以节省创建进程的成本,特别是在Windows上。
如果您在Linux上,waitpid()对您有用吗?您可以在非阻塞模式下使用它以间隔一定时间反复检查是否有一个子进程终止。

2
我可以肯定地说,Pion 是您唯一稳定的选择。
虽然我从未使用过它,但我打算使用它,而且API看起来非常简洁。
至于您需要的Boost库:
  • Boost.Asio
  • Boost.Threading
  • Boost.Spirit(或类似的解析HTTP协议的东西)
  • Boost.IPC

Pion 确实非常有前途。 - skyeagle
Boost.IPC是什么?我可以在boost网站上找到它。我可能确实需要一个IPC框架。 - davka

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

我想避免使用线程有两个原因:1.调试可以使MT应用程序最终成为一个完全的噩梦(至少在我的经验中)。2.鲁棒性:我不希望单个子进程意外终止导致服务器崩溃。 - skyeagle
在这里使用线程可能会遇到困难。为每个连接生成进程不会扩展。避免共享状态,你的MT就不会打扰你。像davka建议的进程池的想法是非常合理的。 - daramarak
其实,我喜欢进程池的想法(为什么我没想到呢!) - skyeagle

1

一般来说,Boost.Asio是一个很好的起点。

但需要注意以下几点:

  1. Boost.Asio 是一个非常好的库,但它并不是非常适合 fork,并且不要尝试在几个 fork 进程之间共享 Asio 事件循环-这样不会起作用(例如如果在 fork 之前创建了 boost::asio::io_service,则不要在之后的多个进程中使用它)。

    此外,它不允许您从 boost::asio::XX::socket 中释放文件处理程序,因此唯一的方法是调用 dup,然后将其传递给子进程。

    但说实话?我认为你不会找到任何网络事件循环库都是 fork 意识的(也许除了我自己写的 CppCMS 的 booster.aio)。

  2. 等待子进程退出很简单,您可以使用 sigaction 定义一个信号处理程序,在 SIGCHLD 信号被发送时处理子进程崩溃或退出。

    所以,您需要做的就是处理这个信号,在主循环中调用 waitpid,当接收到这样的信号时。

    通过 asio,您可以使用“自管道”技巧来从信号处理程序中唤醒循环。


0

首先,看一下CPPCMS。它可能已经符合您的需求。

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

也许您会更感兴趣于基于boost::asio的服务器代码方面的工作:cpp-netlib(这是为提交到boost而制作的)作者的博客


0
我制作了一个自由开源软件库,可以以模块化的方式创建C++应用程序。它托管在

https://github.com/chilabot/chila

这是我的博客:http://chilatools.blogspot.com/view/sidebar

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接