C语言开发HTTP静态服务器的工作逻辑
一、说明
介绍用C语言开发的HTTP静态服务器是什么工作逻辑。
二、具体逻辑
(一)主循环逻辑
#include
#include
int main(){
// 1、定义套接字
int sock;
// 2、初始化服务器
// 端口是80,最多排队200个连接
if(init_server(&sock, 80, 200)){
// 2.1、循环处理客户端连接
while(1){
// 2.1.1、定义地址变量
struct sockaddr_in temp;
// 2.1.2、定义长度
int len;
// 2.1.3、接受客户端
int client = accept(sock, (struct sockaddr*)&temp, &len);
// 2.1.4、调用函数处理连接
if(client != -1){
handle_req(client);
}
}
} else {
printf(\"服务器启动失败\");
}
return 0;
}
(二)具体处理客户端连接的逻辑
// 处理HTTP请求
// 参数:sock是客户端TCP套接字
void handle_req(int sock){
// 定义请求类型
struct http_req req;
// 初始化请求
init_req(sock, &req);
// 定义响应类型
struct http_resp resp;
// 初始化响应
init_resp(sock, &resp);
// 定义存放方法的数组
char m[10];
// 获得请求方法
http_get_method(&req, m);
// 判断如果是get请求
if(equal(\"get\", m) || equal(\"GET\", m)){
// 获得请求的资源路径
char path[255];
http_get_resource(&req, path);
// 定义资源根目录
char base[200] = {\"/usr/local/webroot\"};
// 判断根目录下文件或者目录存在
if(exist(base, path)){
// 判断是目录
if(is_dir(base, path)){
// 输出重定向
// \"/index.html\"是默认主页
resp_redirect(&resp, \"/index.html\");
} else if(is_file(base, path)){
// 如果是文件
// 把文件内容输出到响应体
resp_file(&resp, base, path);
}
} else {
// 输出\"404找不到\"响应
resp_404(&resp);
}
} else {
// 输出\"405不支持请求\"响应
resp_405(&resp);
}
// 关闭套接字
close(sock);
}
三、总结
1、本文的案例是单线程的,顺序处理每个请求,并发量太少。
2、HTTP静态服务器需要提供TCP通信、文件读写、多线程等函数接口。
3、读者需要自己实现解析HTTP请求,输出HTTP报文,需要判断文件是否存在,是否为目录。