Tcp:面向连接的,可靠的,流式服务(传输层协议)
Udp:无连接,不可靠,数据包服务(传输层协议)
Http:应用层协议,端口号80,https(加密)
短链接:一次请求需要一个tcp链接
长链接:多次请求只需要一个tcp链接(目前常用)
请求状态和应答方法:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.t>
#include<arpa/inet.h>
#include<assert.h>
#include<fcntl.h>
int socket_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;
}
return NULL;
}
int main()
{
int sockfd=socket_init();
assert(sockfd!=-1);
while(1)
{
struct sockaddr_in caddr;
int len=sizeof(caddr);
int c=accept(sockfd,(struct sockaddr*)&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]={
"/hemo/stu/c215/day21"};//拼接路径
if(strcmp(file,"/")==0)
{
strcat(path,"/index.html");
}
else
{
strcat(path,filename);
}
int fd=open((path,O_RDONLY);//打开文件
if(fd==-1)
{
send(c,"404",3,0);
close(c);
continuee;
}
int filesize=lseek(fd,0,SEEK_END);//文件大小
lseek(fd,0,SEEK_SET);
//组装http的应答报文
char head_buff[512]={
"HTTP/1.0 200 OK\r\n"};
strcat(head_buff,"Server: myhttp\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);
}
close(fd);
close(c);
}
}
int socket_init()
{
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
return -1;
}
struct sockaddr_in saddr;
mem(&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;
}