mini-httpd源码分析-mini-httpd.c

mini-httpd源码分析-mini-httpd.c

2023年7月26日发(作者:)

mini-httpd源码分析-函数分析;⼀,参数设置:  读取命令⾏参数         配置⽂件参数      读取参数,设置对应的全局变量。主要参数有:配置⽂件;资源⽬录;进程ID⽂件;⽇志⽂件;字符集;主机名及端⼝号...⼆,参数处理:重点分析,主机名及端⼝号,damon  1,主机名及端⼝号    解析主机名,获取对应IP地址,初始化监听套接字(包括:socket,bind,listen)    以IPv4为例:      listen_fd=socket(AF_INET,SOCK_STREAM,0);创建套接字      套接字选项设置:设置⽅法有fcntl,setsockopt      1,fcntl(listen_fd,F_SETFD,FD_CLOEXEC); 设置close-on-exec,exec进程时,关闭此⽂件描述符      2,  int i=1;          setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(void*)&i,sizeof(i));可重⽤本地地址      3,bind(listen_fd,struct sockaddr* -,sizeof(-));绑定套接字和IP:端⼝      4,listen(listen_fd,1024);设置监听套接字最⼤队列长度  2,若不是调试模式,则应该设置为damon模式,    switch(fork()){      case 0: break;  ⼦进程继续执⾏      case -1:    出错,退出程序      default:exit(-1);  ⽗进程退出    }  3,信号处理设置:    SIGTERM: kill发送系统中断进程信号    SIGINT: ⽤户终端Ctrl+C中断进程    SIGHUP:⼀般⽤来通知守护进程再次读取配置⽂件等作⽤,因为守护进程没有终端,不会收到此信号。此处⽤于再次读取⽇志⽂件    SIGCHLD:⼦进程退出时,会发送该信号给⽗进程,⽗进程应该捕捉,否则将产⽣僵⼫进程    SIGPIPE:管道读关闭时写,套接字不再连接时写,都会产⽣此信号。⽹络编程中出现的很多  4,服务器主循环:    若收到SIGHUP信号,则再次打开⽇志⽂件(覆盖),若需要可备份      select模式,多路复⽤:阻塞模式      FD_ZERO(&lfdset);清空描述符集      FD_SET(listen_fd,&lfdset);条件套接字描述符到描述符集中      设置select阻塞读,select(listen_fd+1,&lfdset,NULL,NULL,NULL);永远阻塞,直到listen_fd可读;    若listen_fd可读,调⽤accept,获得已连接套接字描述符,若出错(EAGAIN,资源暂不可⽤;EINTR,中断函数调⽤;ECONNABORT,连接中断。continue,try again),否则异常退出。    若连接成功,fork(),⼦进程处理请求,⽗进程继续循环,监听。      ⼦进程关闭监听套接字,调⽤ handle_request 函数处理请求,退出;⽗进程关闭已连接套接字,继续循环监听。  5,handle_request函数解析    超时设置:利⽤信号SIGALRM,alarm(60);      [设置TCP_NOPUSH套接字选项]    读取请求:循环read,把读取的数据存⼊全局变量request中,每次读取后,重新设置超时alarm(60)    请求解析: get_request_line()      解析请求的第⼀⾏:分三部分:⽅法,路径,协议      解析请求其余部分:初始化对应的全局变量    ⽅法字符串分解:⽅法(GET,HEAD,POST),查询字符串query,?之后    路径解析:获取⽂件名file    超时设置,SIGALRM(写超时设置)    响应:构造请求响应(报头及实体),写套接字(循环write),发送响应。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690378691a340576.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信