目录
1、http协议
(超文本传输协议)(80)[应用层协议]
(1)概念
浏览器和web服务器在应用层通信使用的是http协议,HTTP协议在传输层使用的是TCP协议,浏览器和web服务区三次握手建立连接之后,才能发送HTTP请求报文,那么服务器收到请求报文之后,向浏览器回复http应答报文
(2)使用的端口
浏览器向服务器发起链接之前,需要得到服务器的IP和端口,使用TCP协议的程序一般默认使用80端口
(3)长连接和短连接
服务器与浏览器建立连接之后,如果两次以上的请求复用同一个TCP链接,就称为长连接,如果浏览器发送一次请求报文,服务器一次应答就断开,下次交互再重新进行三次握手连接,就称为短链接,长连接更好,减少网络中的同步报文,也使服务器的响应速度变快
(4)常见web服务器
Apache IIS Nginx Tomcat
2、https(443)
加密的,比http安全,ca证书
报头 空行(\r\n) 数据
3、浏览器连接服务器编程
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
int socket_init();
int main()
{
int sockfd=socket_init();
if(sockfd==-1)
{
printf("sockfd err\n");
exit(1);
}
while(1)
{
struct sockaddr_in caddr;
int len=sizeof(caddr);
int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
if(c<0)
{
continue;
}
char buff[1024]={0};
int n=recv(c,buff,1023,0);
if(n<=0)
{
close(c);
continue;
}
printf("%s",buff);
send(c,"ok",2,0);
close(c);
}
}
int socket_init()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
return -1;
}
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(80);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
return -1;
}
res=listen(sockfd,5);
if(res==-1)
{
return -1;
}
return sockfd;
}
回复浏览器,必须要满足他的格式
浏览器和服务器连接编程
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<fcntl.h>
#define PATH "/home/qqq/c2202/day21"
int socket_init();
char*get_filename(char buff[])
{
char*s=strtok(buff," ");
if(s==NULL)
{
return NULL;
}
printf("qingqiufangfa:%s",s);
s=strtok(buff," ");
return s;
}
int main()
{
int sockfd=socket_init();
if(sockfd==-1)
{
printf("sockfd err\n");
exit(1);
}
while(1)
{
struct sockaddr_in caddr;
int len=sizeof(caddr);
int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
if(c<0)
{
continue;
}
char buff[1024]={0};
int n=recv(c,buff,1023,0);
if(n<=0)
{
close(c);
continue;
}
printf("%s",buff);
char*filename=get_filename(buff);
if(filename==NULL)
{
close(c);
continue;
}
char path[256]={PATH};
if(strcmp(filename,"/")==0)
{
strcat(path,"index.html");
}
else
{
strcat(path,filename);
}
int fd=open(path,O_RDONLY);
if(fd==-1)
{
close(c);
continue;
}
int size=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
char head[128]={"http/1.1 200 ok\r\n"};
strcat(head,"Sever: http\r\n");
printf(head+strlen(head),"Content-Length: %d\r\n",size);
strcat(head,"\r\n");
printf("\n%s",head);
send(c,head,strlen(head),0);
char date[1024]={0};
int num=0;
while((num=read(fd,date,1024))>0)
{
send(c,date,num,0);
}
close(fd);
close(c);
}
}
int socket_init()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
return -1;
}
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(80);
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
return -1;
}
res=listen(sockfd,5);
if(res==-1)
{
return -1;
}
return sockfd;
}