Tiny-httpd源码解析

本文深入探讨Tiny-httpd的源代码,揭示了http服务器的工作原理,涉及关键的socket编程和网络通信技术。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <ctype.h>
#include <strings.h>
#include <string.h>
#include <sys/stat.h>
//#include <pthread.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <stdint.h>

#define ISspace(x) isspace((int)(x))
#define SERVER_STRING "Server: jdbhttpd/0.1.0\r\n"
#define STDIN 0
#define STDOUT 1
#define STDERR 2

void accept_request(void *);
void bad_request(int);
void cat(int, FILE *);
void cannot_execute(int);
void error_die(const char *);
void execute_cgi(int, const char *, const char *, const char *);
int get_line(int, char *, int);
void headers(int, const char *);
void not_found(int);
void serve_file(int, const char *);
int startup(u_short *);
void unimplemented(int);

void accept_request(void * arg){
   
    /*
        arg:一个已连接的套接字描述符
        该函数接收客户端的请求,返回响应
    */
    int client=(intptr_t)arg;
    char buf[1024];
    size_t numchars;
    char method[255];
    char url[255];
    char path[512];
    size_t i,j;
    struct stat st;
    int cgi=0;
    char*query_string=NULL;
    numchars=get_line(client,buf,sizeof(buf));
    i=0;j=0;
    while(!ISspace(buf[i])&&i<sizeof(method)-1){
               //读取请求报文的方法后面加\0
        method[i]=buf[i];
        i++;
    }
    j=i;
    method[i]='\0';

    if(strcasecmp(method,"GET")&&strcasecmp(method,"POST")){
    //如果方法不是GET和POST,发送501响应报文,返回
        unimplemented(client);
        return;
    }
    if(strcasecmp(method,"POST")==0)
        cgi=1;
    i=0;
    while(ISspace(buf[j])&&(j<numchars))
        j++;
    while(!ISspace(buf[j])&&(i<sizof(url)-1)&&(j<numchars)){
    //读取url
        url[i]=buf[j];
        i++;j++;
    }
    url[i]='\0';
    
    if(strcasecmp(method,"GET")==0){
   
        query_string=url;
        while((*query_string!='?')&&(*query_string!='\0')){
    //query_string 指向‘?’或‘\0'
            query_string++;
        }
        if(*query_string=='?'){
                                //如果query_string所指字符为’?‘则将其设置为\0然后指向下一个字符
            cgi=1;
            *query_string='\0';
            query_string++;
        }
    }
    sprintf(path,"thdocs%s",url);                           //将url写入path,thdocs为该源文件目录下的thodocs文件夹,如path为thodocs/或thodocs/index.html
    if(path[strlen(path)-1]=='/')                           //如果path最后一个字符为/则将入后缀index.html
        strcat(path,"index.html");
    if(stat(path,&st)==-1){
   
        while((numchars>0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值