嵌入式学习的第三十五天-进程间通信-HTTP

TCP/IP协议模型:应用层:HTTP;传输层:TCP  UDP;网络层:IPv4 IPv6
网络接口层

一、HTTP协议

1. 万维网

WWW(World Wide Web)
世界范围内的,联机式的信息储藏所。
万维网解决了获取互联网上的数据时需要解决的以下问题:

(1)怎样标识分布在整个互联网上的文档  URL------万维网服务端如何区分请求的数据
(2)用什么样的协议实现万维网上的各种链接  HTTP-----万维网服务端与服务器之间如何通信
(3)怎么使用户能够方便的查看文档数据 HTML(超文本标记语言) ----浏览器端如何展示请求到的万维网数据

2.URL

统一资源定位符  表示从因特网上得到的资源位置和访问这些额资源的方法。

格式:<协议>://<主机>:<端口>/<路径>

    ?参数

3.HTTP

HyperText Transfer Protocol  超文本传输协议
HTTP:80 ---面向文本     HTTPS:443(加密)
定义了万维网客户端如何想万维网服务器请求万维网文档,以及服务器怎样把文档传给客户端。

(1).HTTP工作过程:
1)建立TCP连接
2)客户端向服务器发送HTTP请求报文
3)服务器向客户端发送HTTP响应报文
4)释放TCP连接

(2).HTTP报文格式

请求报文(从客户端向服务器发送请求报文):请求行、消息报头、请求正文
响应报文(从服务器到客户的回答):状态行、消息报头、响应正文

HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,各个字段的长度都是不确定的


(3).请求方式
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT      请求服务器存储一个资源,并用Request-URI作为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
CONNECT 用于代理服务器

(4).状态码

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权 
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

4.JSON格式

键值对的集合
(1)键值对    “关键字”:“字符串值”
(2)对象(集合)      {}
(3)对象数组  []     

5.函数接口

(1).char *strstr(const char *haystack, const char *needle);
功能:在源字符串中定位目标字符串
参数: haystack:源字符串首地址
needle:目标字符串首地址
返回值:成功:定位到的目标字符串的首地址 ; 失败:NULL

(2).char *index(const char *s, int c);
功能:在一个字符串中定位一个字符
参数:s:源字符串
c:需要定位的字符
返回值:成功:返回定位到字符的地址 ; 失败:NULL

响应标头

HTTP/1.1 200 OK Date: Wed, 23 Jul 2025 07:33:59 GMT Content-Type: text/html;charset=utf-8 Server: openresty Vary: Accept-Encoding Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers Trace-Id: 802100e5d5744cb6bba3fdf2ff8a6085.951.17532560398796951 Data-Source: X-Content-Type-Options: nosniff X-XSS-Protection: 0 S-REQ-ID: 159063873961547570 S-REQ-TYPE: 0 X-Cache-Lookup: Cache Miss Content-Encoding: gzip Cache-Control: no-cache Transfer-Encoding: chunked X-NWS-LOG-UUID: 159063873961547570 Connection: keep-alive X-Cache-Lookup: Cache Miss

请求标头

GET / HTTP/1.1 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 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cache-Control: max-age=0 Connection: keep-alive Cookie: SUV=1724151185440cesitz; gidinf=x099980109ee1956b7900e0080001b7b9f522cda0ff1; clt=1753254871; cld=20250723151431; reqtype=pc; _dfp=ZDmA0pQwxr24lgtMFaQG269FjIzJ0xyVW5vsDHNmhqo=; hideAddDesktop=true; t=1753255977242; beans_new_turn=%7B%22sohu-index%22%3A18%7D Host: news.sohu.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0

二、天气爬虫

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include "cJSON.h"
#include "head.h"int init_tcp_cli(const char *ip, unsigned short port)
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("fail socket");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(port);seraddr.sin_addr.s_addr = inet_addr(ip);int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("fail connect");}return sockfd;
}int send_http_request(int sockfd, char *buf, int n)
{char vel[1024] = {0};if (n == 1){snprintf(vel, sizeof(vel),"GET ""/?app=weather.today&cityNm=%s&appkey=76834&sign=""475925eed5360335570b3bb0e264df65&format=json HTTP/1.1\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/138.0.0.0 ""Safari/537.36 Edg/138.0.0.0\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\r\n",buf);}else if (n == 2){snprintf(vel, sizeof(vel),"GET ""/?app=weather.future&cityNm=%s&&appkey=76834&sign=""475925eed5360335570b3bb0e264df65&format=json HTTP/1.1\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/138.0.0.0 ""Safari/537.36 Edg/138.0.0.0\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\r\n",buf);}// printf("Sending request:\n%s\n", vel);ssize_t size = send(sockfd, vel, strlen(vel), 0);if (size < 0){perror("fail send");return -1;}return 0;
}void parse_weather_json(const char *json_str, int type)
{cJSON *root = cJSON_Parse(json_str);if (!root){printf("JSON 解析失败!\n");}cJSON *result = cJSON_GetObjectItem(root, "result");if (!result){printf("找不到 'result' 字段!\n");cJSON_Delete(root);}// printf("%s", (char *)result->valuestring);if (type == 1){printf("\n=== 今日天气 ===\n");// cJSON *item = cJSON_GetArrayItem(result,0);// printf("%s\n",(char *)item);if (result){printf("城市: %s\n",cJSON_GetObjectItem(result, "citynm")->valuestring);printf("天气: %s\n",cJSON_GetObjectItem(result, "weather")->valuestring);printf("温度: %s°C\n",cJSON_GetObjectItem(result, "temperature")->valuestring);printf("湿度: %s%%\n",cJSON_GetObjectItem(result, "humidity")->valuestring);printf("风向: %s\n",cJSON_GetObjectItem(result, "wind")->valuestring);printf("风力: %s\n",cJSON_GetObjectItem(result, "winp")->valuestring);}}else{printf("\n=== 未来天气预报 ===\n");int i = 0;int n = cJSON_GetArraySize((const cJSON *)result);for (i = 0; i < n; ++i){cJSON *item = cJSON_GetArrayItem(result, i);printf("\n日期: %s\n",cJSON_GetObjectItem(item, "days")->valuestring);printf("天气: %s\n",cJSON_GetObjectItem(item, "weather")->valuestring);printf("温度: %s°C ~ %s°C\n",cJSON_GetObjectItem(item, "temp_low")->valuestring,cJSON_GetObjectItem(item, "temp_high")->valuestring);printf("风向: %s\n", cJSON_GetObjectItem(item, "wind")->valuestring);printf("风力: %s\n", cJSON_GetObjectItem(item, "winp")->valuestring);}}cJSON_Delete(root);
}int recv_http_response(int sockfd, int type)
{char buf[4096] = {0};char response[8192] = {0};while (1){memset(buf, 0, sizeof(buf));ssize_t size = recv(sockfd, buf, sizeof(buf) - 1, 0);if (size < 0){perror("fail recv");return -1;}else if (size == 0){break;}strcat(response, buf);}// printf("%s\n",response);char *json_start = strstr(response, "\r\n\r\n");while (*json_start != '{'){json_start++;// printf("%s\n",json_start);}parse_weather_json(json_start, type);// printf("%s\n",json_start);return 0;
}void shuru(int sockfd)
{char buf[1024] = {0};int n = 0;while (1){sockfd = init_tcp_cli("103.205.5.249", 80);memset(buf, 0, sizeof(buf));printf("请输入要查询天气的城市:\n");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = '\0';if (0 == strncmp(buf, "quit", 4)){break;}printf("请输入1或2,1对应该城市的当前天气,2对应该城市的未来天气\n");scanf("%d", &n);getchar();send_http_request(sockfd, buf, n);recv_http_response(sockfd, n);close(sockfd);}
}int main(int argc, char **argv)
{int sockfd = init_tcp_cli("103.205.5.249", 80);if (sockfd < 0){return -1;}shuru(sockfd);close(sockfd);return 0;
}

 相关函数接口学习

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90598.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es 和 lucene 的区别

1. Lucene 是“发动机”&#xff0c;ES 是“整车”Lucene&#xff1a;只是一个 Java 库&#xff0c;提供倒排索引、分词、打分等底层能力。你必须自己写代码处理索引创建、更新、删除、分片、分布式、故障恢复、API 封装等所有逻辑。Elasticsearch&#xff1a;基于 Lucene 的分…

AS32S601 系列 MCU芯片GPIO Sink/Source 能力测试方法

一、引言随着电子技术的飞速发展&#xff0c;微控制器&#xff08;MCU&#xff09;在工业控制、汽车电子、商业航天等众多领域得到了广泛应用。国科安芯推出的AS32S601 系列 MCU 以其卓越的性能和可靠性&#xff0c;成为了众多设计工程师的首选之一。为了确保其在实际应用中的稳…

JAVA-08(2025.07.24学习记录)

面向对象类package com.mm;public class Person {/*** 名词-属性*/String name;int age;double height;/*** 动词-方法*/public void sleep(String add) {System.out.println("我在" add "睡觉");}public String introduce() {return "我的名字是&q…

地下隧道管廊结构健康监测系统 测点的布设及设备选型

隧道监测背景 隧道所处地下环境复杂&#xff0c;在施工过程中会面临围堰变形、拱顶沉降、净空收敛、初衬应力变化、土体塌方等多种危险情况。在隧道营运过程中&#xff0c;也会受到材料退化、地震、人为破坏等因素影响&#xff0c;引发隧道主体结构的劣化和损坏&#xff0c;若不…

node.js卸载与安装超详细教程

文章目录一、卸载Step1&#xff1a;通过控制面板删除node版本Step2&#xff1a;删除node的安装目录Step3&#xff1a;查找.npmrc文件是否存在&#xff0c;有就删除。Step4&#xff1a;查看以下文件是否存在&#xff0c;有就删除Step5&#xff1a;打开系统设置&#xff0c;检查系…

飞算JavaAI“删除接口信息” 功能:3 步清理冗余接口,让管理效率翻倍

在飞算JavaAI的接口设计与管理流程中&#xff0c;“删除接口信息” 功能为用户提供了灵活调整接口方案的便利。该功能的存在&#xff0c;让用户能够在接口生命周期的前期&#xff08;审核阶段&#xff09;及时清理无需创建的接口&#xff0c;保证接口管理的简洁性与高效性。一、…

行业热点丨SimLab解决方案如何高效应对3D IC多物理场与ECAD建模挑战?

半导体行业正快速超越传统2D封装技术&#xff0c;积极采用 3D集成电路&#xff08;3D ICs&#xff09;和2.5D 先进封装等方案。这些技术通过异构芯粒、硅中介层和复杂多层布线实现更高性能与集成度。然而&#xff0c;由于电子计算机辅助设计&#xff08;ECAD&#xff09;数据规…

2025暑期—05神经网络-BP网络

按误差反向传播(简称误差反传)训练的多层前馈网络线性回归或者分类不需要使用神经元&#xff0c;原有最小二程即可。求解J依次变小。使用泰勒展开&#xff0c;只看第一阶。偏导是确定的&#xff0c;需要让J小于0的delta WkWk构造完成后 J&#xff08;Wk1&#xff09;已知&#…

qml的信号槽机制

qml的信号槽机制和qtwidget差不多&#xff0c;但是使用方法不一样&#xff0c;qtwidget一般直接用connect函数把信号和槽一绑定就完事了&#xff0c;qml分为自动绑定和手动绑定。信号自动绑定在一个组件里面定义一个信号&#xff0c;用signal定义&#xff0c;当事件触发&#x…

Unity国际版下载链接分享(非c1国内版)

转载Unity国际版下载链接分享&#xff08;非c1国内版&#xff09; - 哔哩哔哩 大家平时使用Unity注意一下会发现&#xff0c;现在我们下载的Unity版本号后面都一个c1&#xff0c;但是大家在B站学习时大神UP主们使用的Unity版本号大都是没有c1的。 例如&#xff1a;我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在复杂的系统中&#xff0c;每个业务实体都需要使用ID做唯一标识&#xff0c;以方便进行数据操作。例如&#xff0c;每个用户都有唯一的用户ID&#xff0c;每条内容都有唯一的内容ID&#xff0c;甚至每条内容下的每条评论都有唯一的评论ID。 4.1.1 全局唯一与UUID 在互联网还未…

图论水题日记

cf1805D 题意 给定一棵树&#xff0c;规定dis(u,v)≥kdis(u,v) \geq kdis(u,v)≥k时(u,v)(u,v)(u,v)之间存在一条无向边&#xff0c;求k(1,2,...n)k(1,2,...n)k(1,2,...n)时图中的连通块个数 思路 前置知识&#xff1a;树上一点到其最远的点一定是树直径的两个端点之一若一个点…

自定义线程

每个程序至少有一个线程 —— 主线程 主线程是程序的起点&#xff0c;你可以从它开始创建新的线程来执行任务。为此&#xff0c;你需要创建自定义线程&#xff0c;编写在线程中执行的代码&#xff0c;并启动它。 通过继承创建自定义线程 创建新线程有两种主要方式&#xff1a;继…

2025真实面试试题分析-安卓客户端开发

以下是对安卓客户端开发工程师面试问题的分类整理、领域占比分析及高频问题精选&#xff08;基于​​85道问题&#xff0c;总出现次数118次​​&#xff09;。按技术领域整合为​​7大核心类别​​&#xff0c;按占比排序并精选高频问题标注优先级&#xff08;1-5&#x1f31f;…

算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题

拓扑排序&#xff08;Topological Sorting&#xff09;是一种针对有向无环图&#xff08;DAG&#xff09;的线性排序算法&#xff0c;它将图中的顶点按照一定规则排列&#xff0c;使得对于图中的任意一条有向边 u→v&#xff0c;顶点 u 都排在顶点 v 之前。拓扑排序在任务调度、…

利用Web3加密技术保障您的在线数据安全

在这个信息爆炸的数字化时代&#xff0c;保护个人和企业数据安全变得尤为重要。Web3技术以其去中心化和加密特性&#xff0c;为在线数据安全提供了新的解决方案。本文将探讨Web3技术如何通过加密技术保障您的在线数据安全&#xff0c;并介绍如何有效利用这些技术。 什么是Web3技…

Vue实现el-checkbox单选并回显选中

先说需求 我要在页面进行checkbox单选并回显 第一步先把基本的页面写好噢&#xff1a;vue代码&#xff1a;别忘了写change啊<el-form-item label"按钮颜色:" prop"menuColor"><el-checkbox-group v-model"buttonColor" change"bin…

动态规划--序列找优问题【1】

一、说明 动态规划似乎针对问题很多&#xff0c;五花八门&#xff0c;似乎每一个问题都有一套具体算法。其实不是的&#xff0c;动态规划只有两类&#xff1a;1&#xff09;针对图的路径问题 2&#xff09;针对一个序列的问题。本篇讲动态规划针对序列的算法范例。 二、动态规划…

独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG

百度人事再变动。作者|文昌龙编辑|杨舟据「市象」了解&#xff0c;近期&#xff0c;百度副总裁尚国斌即将离职。公开资料显示&#xff0c;尚国斌2010年毕业于南开大学&#xff0c;2012年加入百度&#xff0c;先后在商业分析部、集团战略办、智能驾驶事业群工作。尚国斌同样也在…

Qt 网络编程进阶:HTTP 客户端实现

在 Qt 应用程序中&#xff0c;实现高性能、可靠的 HTTP 客户端是常见需求。Qt 提供了丰富的网络模块&#xff0c;包括 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 等类&#xff0c;用于简化 HTTP 通信。本文将深入探讨 Qt 网络编程中 HTTP 客户端的进阶实现&…