栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux:Http

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux:Http

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309172.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号