忽有感,有做个平台的想法,因此开始接触WEB,在以前看来WEB服务器基本是需要Java or PHP来开发的,但当真正打算学并了解了一部分后,我发现,重点不是用什么语言而是协议。网页与服务器数据交互采用的是http/https协议,要做web服务器首先应该熟悉这个协议,再不济也得会用。
全称:超文本传输协议。是前端页面与后台服务器通信的一种应用层协议,比如前端页面要发送.....突然发现坑挖的有点大,好像现在我的水平还填不上,先留着等以后有了深入了解再补上。
现在想想还是因为理论基础不够扎实,一直认为http和tcp属与并列关系(没想到什么好的词暂且这么说吧),认为tcp是c/s架构的数据传输协议而http是b/s架构的数据传输协议。然而学习一番后发现tcp是传输层协议,也就是说规定如何传输数据。http则是应用层协议,其传输层也是采用的tcp协议。
单程web服务器,注释比较详细所以具体在此不做赘述
#include <unistd.h> #include <fcntl.h> #include <arpa/inet.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int createlistenfd() { //创建一个监听套接字 int fd = socket(AF_INET,SOCK_STREAM,0); //创建套接字 int n = 1; setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&n,4); //地址复用 struct sockaddr_in sin; //声明地址结构体 bzero(&sin,sizeof(sin)); //清空 sin.sin_family = AF_INET; sin.sin_port = htons(8888); //小端转大段,设置端口号 sin.sin_addr.s_addr = INADDR_ANY; //任意地址 //绑定 int r = bind(fd,(struct sockaddr *)&sin,sizeof(sin)); if(r==-1) { //绑定失败 puts("bind shibai"); perror("bind"); exit(-1); //直接退出整个程序 } //开始监听 r = listen(fd,10); if(r==-1) { perror("listen"); exit(-1); //直接退出 } return fd; } void work(int fd,char *s) { //第一步,分析得到客户端所需的文件名 char filename[100] = {0}; sscanf(s,"GET /%s",filename); printf("请求里的文件名是%s\n",filename); //解析mime类型,通过后缀判断 char *mime; if(strstr(filename,".html")) mime = "text/html"; else if(strstr(filename,".jpg")) mime = "image/jpeg"; //构建响应头,发给客户端 char response[100] = {0}; sprintf(response,"HTTP/1.1 200 OK\r\nContent-Type:%s\r\n\r\n",mime); write(fd,response,strlen(response)); //发送具体文件 int filefd = open(filename,O_RDONLY); //只读方式打开 bzero(response,sizeof(response)); //清空缓冲区 int rlen = 0; while((rlen = read(filefd,response,100))>0) { //读到东西 write(fd,response,rlen); } } int main() { while(1) { int sockfd = createlistenfd(); //创建监听套接字 int fd = accept(sockfd,NULL,NULL); //获取浏览器连接的fd char buffer[1024]={0}; //缓冲区 int rlen = read(fd,buffer,sizeof(buffer)); //读取浏览器发送的东西 printf("客户端发来的请求是:%s\n",buffer); work(fd,buffer); close(sockfd); //关闭套接字 } }运行截图
本来是打算好好总结下最近所学但是发现水平有限,有些地方理解的还是不够透彻,只是会了简单的应用,先写成这样,等后面有了系统性的认知打算好好修改一番。最后,如发现有错或有一些好的见解望评论告诉博主,不胜感激。