我正在尝试编写一个处理GET,POST和HEAD请求的小型c ++网络服务器。我的问题是我不知道如何解析标题,消息正文等。它正在侦听套接字,我甚至可以把东西写到浏览器中,但我很好奇我应该如何在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 =>值对的向量,带有请求方法的字符串,发布数据(如PHP中,如果它存在)和查询字符串(/ index for例如)由'/'。
分割的字符串或向量谢谢!
答案 0 :(得分: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();
}
它没有比这简单得多。
答案 1 :(得分: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, ¶ms);
srv.start();
while (true)
Thread::sleep(1000);
}
答案 2 :(得分:1)
您可能需要考虑Facebook的C ++ HTTP框架Proxygen。它是BSD许可下的开源软件。
答案 3 :(得分:0)
是的,这基本上只是字符串解析,然后创建的响应在the specification之后返回到浏览器。
但是,如果这不仅仅是一个爱好项目而且你不想承担一项非常重要的任务,你应该使用Apache,如果你需要扩展的网络服务器,或tntnet,如果你需要一个c ++ web框架,或cpp-netlib如果你需要C ++网络的东西。