嵌入式第三十七天(TCP补充,应用层协议(HTTP))

一.TCP机制

二.HTTP协议

cs 复制代码
#ifndef _HEAD_H
#define _HEAD_H

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>

#endif
cs 复制代码
#include "head.h"

#define SER_PORT 80
#define SER_IP "219.144.82.95"

int create_tcp_connect()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("socket errror");
        return -1;
    }

    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(SER_PORT);
    seraddr.sin_addr.s_addr = inet_addr(SER_IP);

    int ret = connect(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr));
    if(ret < 0)
    {
        perror("connect error");
        return -1;
    }

    return sockfd;
}

int send_http_request(int sockfd)
{
    char *preq = "GET / HTTP/1.1\r\n"
				"Host: news.sohu.com\r\n"
				"User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n"
				"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n"
				"Accept-Language: en-US,en;q=0.5\r\n"
				"Connection: close\r\n"
				"\r\n";
    ssize_t cnt = send(sockfd,preq,strlen(preq),0);
    if(cnt < 0)
    {
        perror("send error");
        return -1;
    }

    return sockfd;
}

int recv_http_response(int sockfd)
{
    char buff[1024] = {0};
    while(1)
    {
        ssize_t cnt = recv(sockfd,buff,sizeof(buff),0);
        if(cnt < 0)
        {
            perror("recv error");
            break;
        }
        else if(0 == cnt)
        {
            printf("接收结束\n");
            break;
        }
        write(1,buff,cnt);
    }
    return 0;
}

int main(int argc,const char *argv[])
{
    int sockfd = create_tcp_connect();
    if(sockfd < 0)
    {
        perror("sockfd errror");
        return -1;
    }

    send_http_request(sockfd);
    recv_http_response(sockfd);

    close(sockfd);

    return 0;
}