学习:IP协议&HTTP协议&Web服务器

一、应用层: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);
}
发布了8 篇原创文章 · 获赞 13 · 访问量 289

猜你喜欢

转载自blog.csdn.net/weixin_44737923/article/details/103032273
今日推荐