http协议和HTTP编程流程

目录

1、http协议

(1)概念

(2)使用的端口

(3)长连接和短连接

(4)常见web服务器

2、https(443)

3、浏览器连接服务器编程


1、http协议

(超文本传输协议)(80)应用层协议

(1)概念

浏览器和web服务器在应用层通信使用的是http协议,HTTP协议在传输层使用的是TCP协议,浏览器和web服务区三次握手建立连接之后,才能发送HTTP请求报文,那么服务器收到请求报文之后,向浏览器回复http应答报文

(2)使用的端口

浏览器向服务器发起链接之前,需要得到服务器的IP和端口,使用TCP协议的程序一般默认使用80端口

(3)长连接和短连接

服务器与浏览器建立连接之后,如果两次以上的请求复用同一个TCP链接,就称为长连接,如果浏览器发送一次请求报文,服务器一次应答就断开,下次交互再重新进行三次握手连接,就称为短链接,长连接更好,减少网络中的同步报文,也使服务器的响应速度变快

(4)常见web服务器

Apache IIS Nginx Tomcat

2、https(443)

加密的,比http安全,ca证书

报头 空行(\r\n) 数据

3、浏览器连接服务器编程

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>

int socket_init();
int main()
{
    int sockfd=socket_init();
    if(sockfd==-1)
    {
        printf("sockfd err\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }

        char buff[1024]={0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }
        printf("%s",buff);

        send(c,"ok",2,0);
        close(c);

    }

}
int socket_init()
{
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        return -1;
    }
    struct sockaddr_in saddr;
    memset(&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;

}

回复浏览器,必须要满足他的格式

浏览器和服务器连接编程

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<fcntl.h>

#define PATH "/home/qqq/c2202/day21"

int socket_init();
char*get_filename(char buff[])
{
    char*s=strtok(buff," ");
    if(s==NULL)
    {
        return NULL;
    }
    printf("qingqiufangfa:%s",s);

    s=strtok(buff," ");
    return s;

}
int main()
{
    int sockfd=socket_init();
    if(sockfd==-1)
    {
        printf("sockfd err\n");
        exit(1);
    }

    while(1)
    {
        struct sockaddr_in caddr;
        int len=sizeof(caddr);
        int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)
        {
            continue;
        }

        char buff[1024]={0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }
        printf("%s",buff);
        char*filename=get_filename(buff);
        if(filename==NULL)
        {
            close(c);
            continue;
        }
        char path[256]={PATH};
        if(strcmp(filename,"/")==0)
        {
            strcat(path,"index.html");
        }
        else
        {
            strcat(path,filename);
        }

        int fd=open(path,O_RDONLY);
        if(fd==-1)
        {
            close(c);
            continue;
        }
        int size=lseek(fd,0,SEEK_END);
        lseek(fd,0,SEEK_SET);

        char head[128]={"http/1.1 200 ok\r\n"};
        strcat(head,"Sever: http\r\n");
        printf(head+strlen(head),"Content-Length: %d\r\n",size);
        strcat(head,"\r\n");
        
        printf("\n%s",head);
        send(c,head,strlen(head),0);
        char date[1024]={0};
        int num=0;
        while((num=read(fd,date,1024))>0)
        {
            send(c,date,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;
    memset(&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;

}
相关推荐
weixin_604236673 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
换个昵称都难7 小时前
webrtc 音频模块FEC模块
网络·音视频·webrtc
youngerwang7 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
zjun10019 小时前
TCP专栏-4.四次挥手
网络协议·tcp/ip
智慧光迅AINOPOL10 小时前
校园在线巡课系统方案:督导全覆盖
网络·全光网解决方案·全光网·校园全光网·校园全光网解决方案
酉鬼女又兒10 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
Urbano11 小时前
工装制作全流程科普:从面料到自动化生产
网络·人工智能
2401_8685347811 小时前
网规笔记 | 真题解析:2018年11月软考网规-网络安全案例分析
网络
Gauss松鼠会11 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
超级无敌zhq11 小时前
后渗透痕迹清理:攻防对抗中的隐身术
网络·数据库·网络安全