项目前言
此项目分为三部分:
- 第一部分为tinyhttpd,完成http请求中的get与post请求处理,返回服务器响应(完成动态请求(cgi程序)与静态请求),目的:了解C/S模式的基本框架与服务器与客户端运行基本流程
- 第二部分为基于socket与linux的多路复用I/O的epoll方法来编写的独立的客户端和服务器通信程序,服务器能接收客户端发送的消息并给客户端回信,目的:熟悉C/S模式,为以后加入线程池高并发做准备
- 第三部分将前两部分项目结合并改造为支持线程池,I/O多路复用epoll的高并发服务器
C/S模式下的常规流程
主要就是这几个函数结合多线程,I/O复用,并发处理,才能搭建很复杂的web服务器。
项目一:Tinyhttpd
Tinyhttp是一个轻量型Http Server,使用C语言开发,全部代码只500多行,还包括一个简单Client.Tinyhttp程序的逻辑为:一个无线循环,一个请求,创建一个线程,之后线程函数处理每个请求,然后解析HTTP请求,做一些判断,之后判断文件是否可执行,不可执行,打开文件,输出给客户端(浏览器),可执行就创建管道,父子进程进行通信。
Tinyhttpd框架描述:
项目二:客户端和服务器通信程序
客户端和服务端都运行在xshell远程连接的服务器上。分别创建server.c和client.c源文件,编译运行就行。
/*客户端*/
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int sockfd, n;
char recvline[4096], sendline[4096], buff[4096];
struct sockaddr_in servaddr;
if (argc != 2) {
printf("输入格式为 ./client.out ipaddress\n");
exit(0);
}
//创建客户端socket描述符sockfd,AF_INET指的是ipv4,SOCK_STREAM提供可靠连接(TCP协议),创建失败返回-1
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0