> 技术文档 > C语言开发HTTP静态服务器的工作逻辑

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报文,需要判断文件是否存在,是否为目录。