文章目录
HTTP协议
面向事务的应用层协议
端口号:80
浏览器输入baidu.com之后会发生什莫?
客户端输入www.baidu.com之后经过DNS(域名解析),得到IP地址,端口默认是80,之后浏览器知道了IP地址和端口号通过connect()向服务器发起连接
HTTP请求
- GET:客户端以只读的方法申请获取资源,不对服务器产生任何其他影响
- POST:客户端向服务器提交数据的方法,可能会影响服务器,服务器可能会根据收到的数据动态创建新的资源,也可能更新原有的资源
HTTP应答
状态类型 | 状态码 状态信息 | 描述 |
---|---|---|
信息 | 100 continue | 客户端先发送100 continue告诉服务器还有数据要发,服务器收到了请求告诉客户端继续发送数据 |
成功 | 200 ok | 请求成功 |
重定向 | 3xx | |
客户端错误 | 4xx 404 not found | 资源未找到 |
服务器错误 | 5xx 500 | 服务器错误 |
[高性能服务器编程:4.6,9]
短链接:一次交互后关闭链接
长链接:keep-alive
int socket_init() //创建套接字
38 {
39 int sockfd = socket(AF_INET,SOCK_STREAM,0);
40 if(sockfd == -1)
41 {
42 return -1;
43 }
44
45 struct sockaddr_in saddr;
46 memset(&saddr,0,sizeof(saddr));
47 saddr.sin_family = AF_INET;
48 saddr.sin_port = htons(80);
49 saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
50
51 int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
52 if(res == -1)
53 {
54 return -1;
55 }
56
57 res = listen (sockfd,5);
58 if(res == -1)
59 {
60 return -1;
61 }
62
63 return sockfd;
64
65 }
#include <sys/socket.h>
#inclede <netinet/in.h>
#inlcude <arpa/inet.h>
#include <assert.h>
int soket_init();
char *get_filename(Char buff[])
{
if(buff!=NULL)
{
return NULL;
}
char* s=strtok(buff,"");
if(s==NULL)
{
return NULL;
}
printf("请求的方法是:%s\n",s);
s=strtok(NULL,"");
if(s=NULL)
{
return NULL;
}
}
int main()
{
int soket=soket_init();
assert(socket!=-1);
while(1)
{
struct sockaddr_in caddr;
in len=sizeof(caddr);
int c=accept (sockfd,(struct socket*)&caddr,&len);
if(c<0)
{
continue;
}
char recv_buff[512]={0};
recv(c,recv_buff,511.0);
printf("read:\n%s\n",recv_buff);//接受浏览器发送过来的数据
char* filename =get_filename(recv_buff);//获取浏览器访问的文件名
if(filename==NULL)
{
send(c,"err",3,0);
close(c);
continue;
}
char path[128]={"/homeu/c215/day21"};//拼接路径
if(strcmp(filename,"/")==0)
{
strcat(path,"/index.html");
else
{
strcat(path,filename);
}
int fd=open(path,0_RODNLY);//打开文件
if(fd==-1)
{
send(c,"404",3,0);
close(c);
continue;
}
}
int filesize=lseek(fd,0,SEEK_END);//文件大小
lseek(fd,0,SEEK_SET);
char head_buff[512]={"HTTP/1,0 200 OK\r\n"};
strcat(head_buff,"Server:myhtttp\r\n");
sprintf(head_buff+strlen(head_buff),"Content_length:%d\r\n",filesize);
strcat(head_buff,"\r\n");
send(c,head_buff,strlen(head_buff),0);
printf("send:%s\n",head_buff);
char data_buff[1024]={0};
int num=0;
while((num=read(fd,data_buff,1024))>0)
{
send(c,data_buff,num,0);
}
/nd(c,"OK 2021 10-9");
close(c);
}
}
int socket_init()
{
int socket=socket(AF_INIT,SOCK_STREAM,0);
if(sockfd==-1)
{
return -1;
}
strcut
}