2013-03-02 13 views
5

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

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' をして終了:標準のGET/POSTリクエスト私の知る限り

は、次のようになります。

'\ n'でリクエストを分割してトリミングする必要がありますか? 投稿データのファイルを処理する方法もありますか?

私が達成したい主なことは、ヘッダーキー=>値のペア、リクエストメソッドを持つ文字列、PHPのようなポストデータ(存在する場合)、およびクエリ文字列(/ index例)を '/'で分割した文字列またはベクトルとして返します。

ありがとうございます!

+1

C++を使用してWebを扱うのは大変です。しかし、あなたが本当にそれを遠くに行きたいなら、あなたはこれよりも弦の操作が難しい方がいいでしょう。 – Shoe

+2

HTTPメッセージを解析する場合は、尋ねる必要があるのは... * [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616.html) * – rdlowrey

+0

あなた自身のサーバーをエクササイズとして書くか、C++内の** Webサーバーライブラリを**使用しますか?その場合、そこには非常に良い解決策があります –

答えて

1

自分ですべてを行う前に、Pocoを紹介しますが、HTTP specificationも読んでください。以下のような

何か:

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); 
} 
0

はい、これはthe specification以下、基本的には単なる文字列を解析して、ブラウザに行く応答作成しています。

しかし、これは趣味のプロジェクトではなく、本当に大きな仕事をしたくない場合は、拡張する必要のあるWebサーバーが必要な場合はどちらかのApacheを使用するか、またはC++が必要な場合はtntnet Webフレームワーク、またはcpp-netlibが必要です。

3

Boost.Asioは良いライブラリですが、低レベルに関連しています。あなたは本当により高いレベルのライブラリを使いたいと思うでしょう。あなたがチェックアウトしなければならないThere’s a modern C++ library called node.native。非常に優れたサーバーは、次のように実装できます。

#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(); 
} 

これ以上は簡単にはなりません。

+0

+1ラムダ関数を使用して! – yash101

1

Proxygen、FacebookのC++ HTTPフレームワークを検討するとよいでしょう。それはBSDライセンスの下でオープンソースです。

関連する問題