Liunx网络编程-应用层

HTTP协议:超文本传输协议

基于传输层TCP协议,端口80
HTTPS :SSL加密方式
默认端口443
curl库
1. HTTP协议工作流程

建立连接:

int init_tcp_clit()
{
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket");
        return -1;
    }
    struct sockaddr_in clit_addr;
    clit_addr.sin_family = AF_INET;
    clit_addr.sin_port = htons(PORT);
    clit_addr.sin_addr.s_addr = inet_addr(IP);
    if (connect(sockfd, (struct sockaddr *)&clit_addr, sizeof(clit_addr)) < 0)
    {
        perror("connect");
        return -1;
    }
    return sockfd;
}

请求响应:

int send_http(int sockfd,char* city)
{
    char buff[1024]= {0};
    char *preq = "GET /?app=weather.today&cityNm=";
    char *p = "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json HTTP/1.1\r\n"
                "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n"
                "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n"
                "Connection: close\r\n"
                "Host: api.k780.com\r\n"
                "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0\r\n"
                "\r\n";

    sprintf(buff, "%s%s%s", preq, city, p);
    ssize_t size = send(sockfd, buff, strlen(buff), 0);
    if (size < 0)
    {
        perror("send");
        return -1;
    }
    return 0;
}

接收响应:

int recv_http(int sockfd)
{
    int fd = open("weather.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if (fd < 0)
    {
        perror("open");
        return -1;
    }
    char buf[1024] = {0};
    while (1)
    {
        ssize_t size = recv(sockfd, buf, sizeof(buf), 0);
        if (size < 0)
        {
            perror("recv");
            return -1;
        }
        else if (size == 0)
        {
            printf("server close\n");
            break;
        }
        write(fd, buf, size);
    }
    close(fd);
    return 0;
}

解析JSON:

int parse_http_response(void)
{
	int fd = open("weather.txt", O_RDONLY);
	if (fd < 0)
	{
		perror("open error");
		return -1;
	} 
	long len = lseek(fd, 0, SEEK_END);
	lseek(fd, 0, SEEK_SET);
	char *buff = malloc(len+1);
	if (NULL == buff)
	{
		perror("malloc error");
		return -1;
	}
	memset(buff, 0, len+1);
	read(fd, buff, len);
	close(fd);

	

	char *p = strstr(buff, "{");
	if (NULL == p)
	{
		perror("strstr error");
		return -1;
	}
	printf("%s\n", p);

	cJSON *pjson = cJSON_Parse(p);
	if (NULL == pjson)
	{
		printf("cJSON_Parse error");
		return -1;
	}

	cJSON *pobj= cJSON_GetObjectItem(pjson, "success");
	if (NULL == pobj)
	{
		printf("cJSON_GetObjectItem error success");
		return -1;
	}
	if (0 == strcmp(pobj->valuestring, "1"))
	{
		pobj= cJSON_GetObjectItem(pjson, "result");
		if (NULL == pobj)
		{
			printf("cJSON_GetObjectItem error result");
			return -1;
		}
		cJSON *pdata = cJSON_GetObjectItem(pobj, "citynm");
		printf("citynm : %s\n", pdata->valuestring);
		pdata = cJSON_GetObjectItem(pobj, "temperature");
		printf("temperature : %s\n", pdata->valuestring);
		pdata = cJSON_GetObjectItem(pobj, "weather");
		printf("weather : %s\n", pdata->valuestring);
		pdata = cJSON_GetObjectItem(pobj, "wind");
		printf("wind : %s\n", pdata->valuestring);
	}
	cJSON_Delete(pjson);
	return 0;
}


2. HTTP报文

新闻

http请求报文:
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
Accept-Language: en-US,en;q=0.5\r\n
Connection: keep-alive\r\n
\r\n
Connection:
keep-alive: 长连接:HTTP通信结束,保持一定时间的连接再断开
close:短连接:HTTP通信结束,立马断开连接
HTTP响应报文:
HTTP/1.1 200 OK\r\n
Date: Wed, 02 Sep 2026 06:31:29 GMT\r\n
Content-Type: text/html;charset=utf-8\r\n
Server: openresty
Vary: Accept-Encoding
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: SUV=1788330689823odinzX9W; Path=/; Domain=sohu.com; Max-
Age=946080000; Expires=Fri, 25 Aug 2056 06:31:29 GMT; Secure; SameSite=None
Trace-Id: a067a38f132249f8a173162c956fc468.88701.17883306898232510
Data-Source:
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
S-REQ-ID: 12342245799539308391
S-REQ-TYPE: 0
X-Cache-Lookup: Cache Miss
Content-Encoding: gzip
Cache-Control: no-cache
Transfer-Encoding: chunked
X-NWS-LOG-UUID: 12342245799539308391\r\n
Connection: keep-alive\r\n
X-Cache-Lookup: Cache Miss\r\n
\r\n
<!DOCTYPE html><html lang=zh-CN><head>
<script>if(window&&window.performance&&typeof
window.performance.now==='function'){

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值