C ++ Web开发

时间:2011-04-19 01:26:47

标签: c++ web-development-server

据我所知,由于C ++不是动态的,因此它不被视为构建网站的特别好的基础,但我认为它部分归结为支持。是否存在像root一样运行C ++程序的服务器,例如node.js创建服务器,然后处理所有转到root的请求但CGI(我不想使用)就像一个Php网页,有限用恼人的重写来减缓Apache的速度。是否有任何C ++库可以让您轻松嵌入服务器。

2 个答案:

答案 0 :(得分:4)

我最近(就像两天前一样)不得不用C ++重写Java Jetty servlet(由于OpenCV的一些JNI问题我也在使用)。我和你有完全相同的问题而且没有简单的答案(我也不想使用CGI)。我建议做几件事:

使用boost,使用boost,使用boost
Boost使跨平台部署变得非常简单,而且(我敢说)很有趣!我的开发机器运行的是Windows 7,但是我不得不在Linux服务器上部署服务器并且使其变得非常容易。

使用HTTP库
对于我的项目,我发现cpp-netlib,这使得编写servlet(如果你甚至可以称之为)非常容易。它提供对requestresponse个对象的访问,甚至支持多线程。这是他们网站上的服务器示例:

#include <boost/network/protocol/http/server.hpp>
#include <string>
#include <iostream>

namespace http = boost::network::http;

struct hello_world;
typedef http::server<hello_world> server;

struct hello_world {
    void operator() (server::request const &request,
                     server::response &response) {
        std::string ip = source(request);
        response = server::response::stock_reply(
            server::response::ok, std::string("Hello, ") + ip + "!");
    }
};

int
main(int argc, char * argv[]) {

    if (argc != 3) {
        std::cerr << "Usage: " << argv[0] << " address port" << std::endl;
        return 1;
    }

    try {
        hello_world handler;
        server server_(argv[1], argv[2], handler);
        server_.run();
    }
    catch (std::exception &e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }

    return 0;
}

非常整洁,(从我看到的)它也非常强大。不要(不要)编写自己的HTTP 1.x实现。我强烈反对这一点,因为这是一项巨大的时间投入,而且没有理由重新发明轮子。

做对你有用的事
如果您需要服务器有一些热插拔部件,请随意使用像LUA这样的简单脚本语言 - 否则,只需准备好在每次迭代时编译。

答案 1 :(得分:1)

  

我理解,因为C ++不是动态的

不是,这意味着您为网站编写的任何代码都必须以与服务器软件包和操作系统兼容的方式进行编译,并在每次更改时重新编译。您可能不希望在生产服务器上重新编译,因此您可能有另一台相同服务器的开销(您可能已经有了测试,这将使其成为非问题)。

当您需要从该位获得性能时,您可以用C或C ++编写CGI脚本。有一些库可以简化,你应该能够找到教程(a quick Google search提出this)。

在某些情况下,您还可以编写模块来扩展脚本语言。我知道PHP主要是在C下面实现的,我相信大多数其他脚本语言都允许添加C模块(C ++可能有点困难,但应该小心或包装)。你可以研究一下。

我不建议在网站上使用Qt,它似乎并非真正用于此目的,并且可能带有很多你不需要的东西。如果你走的是这条路线,那么更简单的C / C ++会更好(也更快)。

与脚本语言(有点意见)相比,您可能希望仔细编写和优化的C / C ++更快,内存使用更少,但最初写入可能会有点困难,稍后修改并可能调试。但是,如果您的问题需要它,那么这是一个可行的选择。