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;

}
相关推荐
涔溪1 小时前
HTTP TCP三次握手深入解析
网络·tcp/ip·http
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
三菱-Liu2 小时前
三菱MR-J4-B伺服连接器和信号排列
网络·驱动开发·硬件工程·制造·mr
WeeJot嵌入式2 小时前
网络安全:挑战、策略与未来趋势
网络
a1denzzz5 小时前
Linux系统的网络设置
linux·服务器·网络
黑客K-ing6 小时前
网络安全名词解释
开发语言·网络·安全·网络安全·php
ZachOn1y7 小时前
计算机网络:运输层 —— 运输层端口号
网络协议·tcp/ip·计算机网络·udp·tcp·端口号
Z pz7 小时前
网络编程——Python简单TCP通信功能代码实践
网络·python·tcp/ip
QQ_7781329747 小时前
信息收集、漏洞扫描、漏洞利用、权限提升、数据泄露
网络·计算机网络
运维小文7 小时前
K8资源之endpoint资源&EP资源
linux·网络·k8s·运维开发