忽有感,有做个平台的想法,因此开始接触WEB,在以前看来WEB服务器基本是需要Java or PHP来开发的,但当真正打算学并了解了一部分后,我发现,重点不是用什么语言而是协议。网页与服务器数据交互采用的是http/https协议,要做web服务器首先应该熟悉这个协议,再不济也得会用。
1、What is HTTP?
全称:超文本传输协议。是前端页面与后台服务器通信的一种应用层协议,比如前端页面要发送.....突然发现坑挖的有点大,好像现在我的水平还填不上,先留着等以后有了深入了解再补上。
2、之前对HTTP的误解
现在想想还是因为理论基础不够扎实,一直认为http和tcp属与并列关系(没想到什么好的词暂且这么说吧),认为tcp是c/s架构的数据传输协议而http是b/s架构的数据传输协议。然而学习一番后发现tcp是传输层协议,也就是说规定如何传输数据。http则是应用层协议,其传输层也是采用的tcp协议。
3、一个简单的应用
单程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); //关闭套接字
}
}
运行截图
写在最后:
本来是打算好好总结下最近所学但是发现水平有限,有些地方理解的还是不够透彻,只是会了简单的应用,先写成这样,等后面有了系统性的认知打算好好修改一番。最后,如发现有错或有一些好的见解望评论告诉博主,不胜感激。