Linux:Http

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;
}

猜你喜欢

转载自blog.csdn.net/qq_48580892/article/details/120678553