资源简介

运用网络编程和并发编程的知识,设计一个简单的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个文件信息

评论

共有 条评论