嵌入式學習的第三十五天-進程間通信-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
英文地址,請注明出處:http://en.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 客戶端的進階實現&…