资源简介
运用网络编程和并发编程的知识,设计一个简单的web服务器,在实现的过程中学习网络套接字编程、HTTP 协议、Web 服务器、cgi'等知识;提供静态网页浏览服务功能、动态网页服务功能,以及可以显示图片。
代码片段和文件信息
/* $begin tinymain */
/*
* tiny.c - A simple iterative HTTP/1.0 Web server that uses the
* GET method to serve static and dynamic content.
*/
#include “csapp.h“
void doit(int fd);
void read_requesthdrs(rio_t *rp);
int parse_uri(char *uri char *filename char *cgiargs);
void serve_static(int fd char *filename int filesize);
void get_filetype(char *filename char *filetype);
void serve_dynamic(int fd char *filename char *cgiargs);
void clienterror(int fd char *cause char *errnum
char *shortmsg char *longmsg);
int main(int argc char **argv)
{
int listenfd connfd port clientlen;
struct sockaddr_in clientaddr;
/* 检查命令行参数 */
if (argc != 2) {
/*fprintf函数
原型:int fprintf ( FILE * stream const char * format ... );
描述:将格式指向的C字符串写入流中
参数:stream:指向标识输出流的FILE对象的指针。
format:包含要写入流的文本的C字符串。
返回值:成功:返回写入的字符总数。
发生写入错误:设置错误指示符(ferror)并返回负数。
编写宽字符时发生多字节字符编码错误:将errno置为EILSEQ,返回负数
*/
fprintf(stderr “usage: %s \n“ argv[0]);
exit(1);
}
//atoi方法将字符串变成整型
port = atoi(argv[1]);
//调用csapp头文件中的Open_listenfd方法
listenfd = Open_listenfd(port);
while (1) {
clientlen = sizeof(clientaddr);
connfd = Accept(listenfd (SA *)&clientaddr &clientlen);
doit(connfd);
Close(connfd);
}
}
/* doit - 处理一个HTTP请求/响应事务*/
void doit(int fd)
{
int is_static;
/*struct stat:描述一个linux系统文件系统中的文件属性的结构。
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //伟建内容对应的块数量 };
*/
struct stat sbuf;
char buf[MAXLINE] method[MAXLINE] uri[MAXLINE] version[MAXLINE];
char filename[MAXLINE] cgiargs[MAXLINE];
rio_t rio;
/* Read request line and headers */
/*void rio_readinitb(rio_t *rp int fd)
描述:rio_t 结构体初始化并绑定文件描述符与缓冲区
参数:rio_t结构体
fd 文件描述符
*/
Rio_readinitb(&rio fd);//将rio初始化
/*ssize_t rio_readlineb(rio_t *rp void *usrbuf size_t maxlen)
描述:读取一行的数据,遇到‘\n‘结尾代表一行
参数:rp:rio_t包
usrbuf:用户地址,即目的地址
size_t 一行最大的长度。若一行数据超过最大长度,则以‘\0‘截断
返回值:真正读取到的字符数量
*/
Rio_readlineb(&rio buf MAXLINE); //读取rio的一行到buf中
/*sscanf函数
原型 int sscanf (const char *strconst char * format........);
函数说明 将参数str的字符串根据参数format字符串来转换并格式化数据
返回值 成功返回参数数目,失败返回-1,错误原因存于errno 返回0表示失败 */
sscanf(buf “%s %s %s“ method uri version);//将buf中的值以空格为分界
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1701 2020-07-30 23:47 实习代码\cgi-bin\adder.c
文件 31762 2020-07-31 08:12 实习代码\cgi-bin\adder.cgi
文件 963 2020-07-30 23:05 实习代码\cgi-bin\adder.c~
文件 393 2020-07-31 08:51 实习代码\cgi-bin\first.c
文件 8647 2020-07-31 08:51 实习代码\cgi-bin\first.cgi
文件 397 2020-07-31 08:47 实习代码\cgi-bin\first.c~
文件 179 2020-07-29 15:35 实习代码\csapp\cpstdin.c
文件 17773 2020-07-29 15:36 实习代码\csapp\csapp.c
文件 23041 2020-07-29 15:56 实习代码\csapp\csapp.h
文件 303 2020-03-12 11:46 实习代码\example1_travel\example1_travel.iml
文件 11206 2020-03-12 15:42 实习代码\example1_travel\h1_first_page.html
文件 472751 2018-01-26 14:10 实习代码\example1_travel\image\banner_1.jpg
文件 483792 2018-01-26 15:34 实习代码\example1_travel\image\banner_2.jpg
文件 417348 2018-01-26 15:35 实习代码\example1_travel\image\banner_3.jpg
文件 33932 2018-01-30 13:31 实习代码\example1_travel\image\footer_service.png
文件 169953 2018-01-26 14:10 实习代码\example1_travel\image\guonei_1.jpg
文件 9831 2018-01-30 13:44 实习代码\example1_travel\image\hotel_tel.png
文件 3024 2018-01-26 14:10 实习代码\example1_travel\image\hot_tel.jpg
文件 5113 2018-01-26 14:10 实习代码\example1_travel\image\icon_1.jpg
文件 4791 2018-01-26 14:10 实习代码\example1_travel\image\icon_2.jpg
文件 4986 2018-01-26 14:10 实习代码\example1_travel\image\icon_3.jpg
文件 4624 2018-01-26 14:10 实习代码\example1_travel\image\icon_4.jpg
文件 2471 2018-01-26 14:16 实习代码\example1_travel\image\icon_5.jpg
文件 2986 2018-01-26 14:16 实习代码\example1_travel\image\icon_6.jpg
文件 2668 2018-01-26 14:10 实习代码\example1_travel\image\icon_7.jpg
文件 143051 2018-01-26 14:10 实习代码\example1_travel\image\jiangwai_1.jpg
文件 44779 2018-01-26 14:10 实习代码\example1_travel\image\jiangxuan_1.jpg
文件 41113 2018-01-26 14:10 实习代码\example1_travel\image\jiangxuan_2.jpg
文件 38788 2018-01-26 14:10 实习代码\example1_travel\image\jiangxuan_3.jpg
文件 32906 2018-01-26 14:10 实习代码\example1_travel\image\jiangxuan_4.jpg
............此处省略37个文件信息
- 上一篇:基于单片机的交通灯设计.doc
- 下一篇:共享内存 读写
相关资源
- 基于单片机的交通灯设计.doc
- 人脸识别(opencv_facedetect_v4l2)
- gd32的单通道adc用dma采集
- vscode作为编辑器开发stm32f103c8
- usb之CDC(CDC_Standalone.rar)
- LC-PWM-RGB(RGB LED灯 调色调光器 PWM控制
- 《LINUX C编程从初学到精通》光盘源码
- SJA1000 CAN芯片驱动(SJA1000.c)
- 嵌入式QtC++编程课件
- 物联网GPS跟踪器demo程序
- 嵌入式c编程语言入门与深入.pdf58199
- C51单片机技术教程(304页)
- C语言模块化编程(我见过最好的)
- 基于esp32的摄像头采集图像代码
- C51单片机交通
- PCA9539驱动程序
- STM32连接EC20使用内置MQTT协议接入阿里
- TM4C123中文手册
- 单片机C语言实战开发108例
- stm32 AD7506
- stc-isp-15xx-v6.86G
- Linux那些事儿之我是USB core
- STC8G1K08A红外遥控点灯
- C语言的嵌入式汇编基本使用.docx(2页
- stm32f103c8t6开发板原理图+pcb
- Arduino 敲琴MIDI电子琴 程序报告.docx
- CAN实验
- LCD驱动芯片ST7701SI SPI接口底层驱动配
- 显示屏操作(stm32f103c8t6(SAN))
- USB CAN Tool 源代码(LabVIEW 2011环境)
评论
共有 条评论