#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
Tiny-httpd源码解析
最新推荐文章于 2024-04-22 09:48:09 发布
本文深入探讨Tiny-httpd的源代码,揭示了http服务器的工作原理,涉及关键的socket编程和网络通信技术。
摘要由CSDN通过智能技术生成