Tcp:面向连接的,可靠的,流式服务(传输层协议)
Udp:无连接,不可靠,数据包服务(传输层协议)
Http:应用层协议,端口号80,https(加密)
短链接:一次请求需要一个tcp链接
长链接:多次请求只需要一个tcp链接(目前常用)
请求状态和应答方法:
#include#include #include #include #include #include #include #include #include int socket_init(); char* get_filename(char buff[]) { if(buff==NULL) { return NULL; } char*s=strtok(buff," "); if(s==NULL) { return NULL; } printf("请求方法是:%sn",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%sn",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 OKrn"}; strcat(head_buff,"Server: myhttprn"); sprintf(head_buff+strlen(head_buff),"Content-Length: %drn",filesize); strcat(head_buff,"rn"); send(c,head_buff,strlen(head_buff),0);//先发送头部 printf("send:%sn",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; }



