10

GET、POST、HEADリクエストを処理する小さなc++Webサーバーを作成しようとしています。私の問題は、ヘッダーやメッセージ本文などを解析する方法がわからないことです。ソケットでリッスンしているので、ブラウザーに正常に書き込むこともできますが、C++でこれをどのように行うべきか興味があります。

Afaikの標準のGET/POSTリクエストは、次のようになります。

GET /index HTTP/1.1
Host: 192.168.0.199:80
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)     Chrome/25.0.1364.97 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

this is the message body

すべての行は「\r\n」で終わりました。

'\ n'でリクエストを分割し、それらをトリミングする必要がありますか(その場合はどのように)?また、投稿データのファイルを処理する方法は?

私が達成したい主なことは、ヘッダーkey => valueペアを含むベクトル、requestメソッドを含む文字列、postデータ(PHPが存在する場合など)、およびクエリ文字列(/ indexなど)を文字列として取得することです。または'/'で分割されたベクトル。

ありがとう!

4

4 に答える 4

2

すべてを自分で行う前に、Pocoを紹介します:

class MyHTTPRequestHandler : public HTTPRequestHandler
{
public:
    virtual void handleRequest(HTTPServerRequest & request,
                               HTTPServerResponse & response) {
        // Write your HTML response in res object
    }
};

class MyRequestHandlerFactory : public HTTPRequestHandlerFactory
{
    MyHTTPRequestHandler handler;

public:
    MyRequestHandlerFactory(){}
    HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
    {
        const string method = request.getMethod();
        if (method == "get" || method == "post")
            return &handler;
        return 0;
    }
};

int main()
{
    HTTPServerParams params;
    params.setMaxQueued(100);
    params.setMaxThreads(16);
    ServerSocket svs(80);
    MyRequestHandlerFactory factory;
    HTTPServer srv(&factory, svs, &params);
    srv.start();
    while (true)
        Thread::sleep(1000);
}
于 2013-03-02T21:06:11.840 に答える
2

Boost.Asioは優れたライブラリですが、比較的低レベルです。あなたは本当により高いレベルのライブラリを使いたいと思うでしょう。node.nativeと呼ばれる最新のC++ライブラリがあります。これを確認する必要があります。非常にサーバーは次のように実装できます。

#include <iostream>
#include <native/native.h>
using namespace native::http;

int main() {
    http server;
    if(!server.listen("0.0.0.0", 8080, [](request& req, response& res) {
        res.set_status(200);
        res.set_header("Content-Type", "text/plain");
        res.end("C++ FTW\n");
    })) return 1; // Failed to run server.

    std::cout << "Server running at http://0.0.0.0:8080/" << std::endl;
    return native::run();
}

これほど単純になることはありません。

于 2013-04-19T15:44:40.080 に答える
1

はい、これは基本的に文字列の解析と、仕様に従ってブラウザに戻る応答の作成です。

しかし、これが単なる趣味のプロジェクトではなく、本当に大きなタスクを引き受けたくない場合は、拡張する必要があるWebサーバーが必要な場合はApacheを使用するか、c++Webフレームワークが必要な場合はtntnetを使用する必要があります。 C++ネットワークのものが必要な場合はcpp-netlib 。

于 2013-03-02T21:10:51.777 に答える
1

FacebookのC++HTTPフレームワークであるProxygenを検討することをお勧めします。BSDライセンスの下でのオープンソースです。

于 2014-11-19T16:22:08.020 に答える