资源简介
基于linux通过c实现web服务器,适合新手 学习了知识点,然后通过项目巩固一下知识点,也可以了解http协议。
代码片段和文件信息
/* J. David‘s webserver */
/* This is a simple webserver.
* Created November 1999 by J. David Blackstone.
* CSE 4344 (Network concepts) Prof. Zeigler
* University of Texas at Arlington
*/
/* This program compiles for Sparc Solaris 2.6.
* To compile for Linux:
* 1) Comment out the #include line.
* 2) Comment out the line that defines the variable newthread.
* 3) Comment out the two lines that run pthread_create().
* 4) Uncomment the line that runs accept_request().
* 5) Remove -lsocket from the Makefile.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ISspace(x) isspace((int)(x))
#define SERVER_STRING “Server: jdbhttpd/0.1.0\r\n“
void accept_request(int);
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);
/**********************************************************************/
/* A request has caused a call to accept() on the server port to
* return. Process the request appropriately.
* Parameters: the socket connected to the client */
/**********************************************************************/
void accept_request(int client)
{
char buf[1024];
int numchars;
char method[255];
char url[255];
char path[512];
size_t i j;
struct stat st;
int cgi = 0; /* becomes true if server decides this is a CGI
* program */
char *query_string = NULL;
numchars = get_line(client buf sizeof(buf));
i = 0; j = 0;
while (!ISspace(buf[j]) && (i < sizeof(method) - 1))
{
method[i] = buf[j];
i++; j++;
}
method[i] = ‘\0‘;
if (strcasecmp(method “GET“) && strcasecmp(method “POST“))
{
unimplemented(client);
return;
}
if (strcasecmp(method “POST“) == 0)
cgi = 1;
i = 0;
while (ISspace(buf[j]) && (j < sizeof(buf)))
j++;
while (!ISspace(buf[j]) && (i < sizeof(url) - 1) && (j < sizeof(buf)))
{
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++;
if (*query_string == ‘?‘)
{
cgi = 1;
*query_string = ‘\0‘;
query_string++;
}
}
sprintf(path “htdocs%s“ url);
if (path[strlen(path) - 1] == ‘/‘)
strcat(path “index.html“);
if (stat(path &st) == -1) {
while ((numchars > 0) && strcmp(“\n“ buf)) /* read & discard headers */
numchars = get_line(client buf sizeof(buf));
not_found(client);
}
else
{
if ((st.st_mode & S_IFMT) == S_IFDIR)
strcat(path “/index.html“);
if ((st.st_mode & S
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-08-14 23:20 http服务器\
目录 0 2017-08-14 23:20 http服务器\htdocs\
文件 479 2017-08-14 23:20 http服务器\htdocs\check.cgi
文件 320 2017-08-14 23:20 http服务器\htdocs\color.cgi
文件 218 2017-08-14 23:20 http服务器\htdocs\index.html
文件 308 2017-08-14 23:20 http服务器\htdocs\README
文件 14537 2017-08-14 23:20 http服务器\httpd.c
文件 95 2017-08-14 23:20 http服务器\Makefile
文件 1904 2017-08-14 23:20 http服务器\README
文件 673 2017-08-14 23:20 http服务器\simpleclient.c
- 上一篇:nrf2401程序(收发都有注释清晰)
- 下一篇:IR2136应用笔记
相关资源
- 使用ATLAS探测器在s = 13 $$ \\ sqrt {s} =
- 在ATLAS探测器上搜索衰变到增强夸克对
- 搜索在s = 13 TeV pp碰撞中在pp碰撞中产
- 使用ATLAS检测器在s = 13 $$ \\ sqrt {s} =
- 使用ATLAS检测器,在s = 7 TeV的pp碰撞中
- W s Z玻色子对生产横截面在pp碰撞中的
- 使用ATLAS探测器在s = 13 TeV的pp碰撞中用
- 使用ATLAS探测器在s = 8 $$ \\ sqrt {s} =
- 在与ATLAS探测器发生s = 8 TeV pp碰撞的
- 使用ATLAS探测器在s = 7TeV的pp碰撞中区
- 使用ATLAS探测器在13 TeV pp碰撞中搜索轨
- 使用ATLAS探测器在s = 8 TeV的质子-质子
- 使用ATLAS探测器在s = 13 $$ \\ sqrt {s} =
- 使用ATLAS探测器在s = 13 TeV的pp碰撞中搜
- 类似QCD的新领域中的Theta
- 在CERN LHC的pPb碰撞中探索矢量介子光生
- 强子对撞机中光子与强子相互作用中
- 膨胀玻璃通量管中的非平衡轴向电荷
- 从胶子场散射的夸克喷流:从饱和到
- 带有彩色玻璃冷凝液的偶极Wilson线性
- 玻色增强,Liouville有效作用以及p-A碰
- 彩色玻璃冷凝液在小系统碰撞中方位
- 高能分解中的旋转螺旋方法:彩色玻
- CGC因式分解用于质子-核碰撞中正向产
- 大型强子对撞机质子-铅碰撞中的饱和
- 彩色玻璃冷凝物密度矩阵:Lindblad演化
- 相对论重离子对撞机小型系统扫描的
- 彩色玻璃冷凝液的衍射dijet产量和Wi
- Kharzeev-Levin-Nardi模型中的热辐射和包容
- 重子停留在彩色玻璃冷凝物中的时空
评论
共有 条评论