准备文件
首先准备以下文件:
- HttpServer.cc:用于运行接收 HTTP 请求的服务。
- HttpServer.hpp:定义 HTTP 请求相关类。
- Log.hpp:打印日志的小组件。
- Socket.hpp:套接字组件。
直接调用相关接口即可(Log.hpp 和 Socket.hpp 的实现细节不在此讲解)。
Makefile
HttpServer:Httpserver.cc
g++ -o $@ $^ -std=c++11 -g -lpthread
.PHONY:clean
clean:
rm -rf HttpServer
HttpServer.hpp
类内成员
class HttpServer {
public:
HttpServer(uint16_t port = defaultport) :port_(port) {}
static void* ThreadRun(void* args) { }
void start() { }
~HttpServer() {};
private:
Socket listensock_;
uint16_t port_;
};
类内的成员变量包括端口号 port_,启动服务时输入端口号。listensock_ 用于接收主机请求。ThreadRun 是线程执行的方法,用于管理服务。
封装 sockfd
为了将 sockfd 传给线程,使用 ThreadData 结构体封装:
struct ThreadData {
int sockfd;
};
ThreadRun 必须是静态成员函数才能作为线程执行方法。通过传递 ThreadData* 指针给线程,使其能访问 sockfd。
start
start 函数负责服务启动流程:初始化、绑定、监听,然后循环接收请求。建立连接后获取 sockfd,封装后传给线程处理。


