一、应用层:DNS 域名解析协议
域名是什么??例如百度的域名:www.baidu.com
域名的解析方式:域名转化为其对应的IP地址
(1)递归式的解析----》解析都要经过根服务器继续向下。
(2)迭代式的解析—》解析最终要交给本地服务器进行,减缓了根服务器的压力。
二、 HTTP 超文本传输协议
(1)HTTP请求报头
小问题:HTTP1.0和HTTP1.1的区别是什么??
(2)HTTP应答报头
(3)web服务器
怎么管理服务器?
三、网络层协议----》IP协议
IP报头(要记住的!!!)
Web服务器代码实现
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<sys/stat.h>
int CreateSocket()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
assert(sockfd != -1);
struct sockaddr_in ser;
memset(&ser,0,sizeof(ser));
ser.sin_family = AF_INET;
ser.sin_port = htons(80);
//ser.sin_addr.s_addr = inet_addr("192.168.31.118");
ser.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = bind(sockfd,(struct sockaddr*)&ser,sizeof(ser));
assert(res != -1);
listen(sockfd,5);
return sockfd;
}
void DealBuff(int fd,char *buff);
void SendHead(int c,int size,int flag);
int main()
{
int sockfd = CreateSocket();
while(1)
{
struct sockaddr_in cli;
socklen_t len = sizeof(cli);
int c = accept(sockfd,(struct sockaddr*)&cli,&len);
if(c < 0)
{
continue;
}
char buff[1024] = {0};
int n = recv(c,buff,1023,0);
if(n <= 0)
{
continue;
}
DealBuff(c,buff);
close(c);
}
}
void SendHead(int c,int size,int flag)
{
char head[1024] = "HTTP/1.1";
if(flag)
{
strcat(head,"404 Not Found\r\n");
}
else
{
strcat(head,"200 OK\r\n");
}
strcat(head,"Server:MyWeb1.0\r\n");
sprintf(head + strlen(head),"Content-Length: %d\r\n",size);
strcat(head,"Content-Type: text/html;charset=utf-8\r\n");
strcat(head,"\r\n");
send(c,head,strlen(head),0);
}
void SendFile(int c,int fd)
{
char buff[128] = {0};
int n = 0;
while(n = read(fd,buff,127))
{
send(c,buff,n,0);
}
}
void DealBuff(int c,char *buff)
{
printf("%s,buff");
//buff: GET/index.html HTTP/1.1
char *p = strtok(buff," ");
p = strtok(NULL," ");//p->/index.html
char Path[128] = {0};
strcat(Path,p);
int flag = 0;
int fd = open(Path,O_RDONLY);
if(fd == 1)
{
fd = open("/var/www/htm.html",O_RDONLY);
flag = 1;
}
struct stat st;
fstat(fd,&st);
SendHead(c,st.st_size,flag);
SendFile(c,fd);
close(fd);
}