最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++實(shí)現(xiàn)HTTP協(xié)議解析的示例代碼

 更新時(shí)間:2022年07月21日 11:43:01   作者:程序猿編碼  
基本上,HTTP?是一種基于?TCP/IP?的通信協(xié)議,用于通過?Web?傳遞?HTML?文件、圖像文件、查詢結(jié)果等數(shù)據(jù)。本文將用C/C++實(shí)現(xiàn)HTTP協(xié)議解析,感興趣的可以了解一下

超文本傳輸協(xié)議 (HTTP) 是分布式、協(xié)作、超媒體信息系統(tǒng)的應(yīng)用層協(xié)議。 這是自 1990 年以來萬維網(wǎng)數(shù)據(jù)通信的基礎(chǔ)。HTTP 是一種通用且無狀態(tài)的協(xié)議,它可以用于其他目的,也可以使用其請(qǐng)求方法、錯(cuò)誤代碼和標(biāo)頭的擴(kuò)展。

基本上,HTTP 是一種基于 TCP/IP 的通信協(xié)議,用于通過 Web 傳遞 HTML 文件、圖像文件、查詢結(jié)果等數(shù)據(jù)。 它為計(jì)算機(jī)之間的通信提供了一種標(biāo)準(zhǔn)化的方式。 HTTP 規(guī)范指定了客戶端請(qǐng)求的數(shù)據(jù)如何發(fā)送到服務(wù)器,以及服務(wù)器如何響應(yīng)這些請(qǐng)求。

HTTP客戶端和服務(wù)器通信

客戶端和服務(wù)器通過交換單獨(dú)的消息(而不是數(shù)據(jù)流)進(jìn)行通信。 客戶端(通常是 Web 瀏覽器)發(fā)送的消息稱為請(qǐng)求,服務(wù)器發(fā)送的作為應(yīng)答的消息稱為響應(yīng)。

HTTP通過 TCP 或 TLS 加密的 TCP 連接發(fā)送的應(yīng)用層協(xié)議,盡管理論上可以使用任何可靠的傳輸協(xié)議。 由于其可擴(kuò)展性,它不僅用于獲取超文本文檔,還用于獲取圖像和視頻或?qū)?nèi)容發(fā)布到服務(wù)器,例如 HTML 表單結(jié)果。 HTTP 還可用于獲取部分文檔以按需更新網(wǎng)頁。

HTTP和連接

連接是在傳輸層控制的,因此基本上超出了 HTTP 的范圍。 HTTP 不要求底層傳輸協(xié)議是基于連接的;

它只要求它是可靠的,或者不丟失消息。在 Internet 上最常見的兩種傳輸協(xié)議中,TCP 是可靠的,而 UDP 則不是。因此,HTTP 依賴于基于連接的 TCP 標(biāo)準(zhǔn)。

在客戶端和服務(wù)器可以交換 HTTP 請(qǐng)求/響應(yīng)對(duì)之前,它們必須建立 TCP 連接,這個(gè)過程需要多次往返。

HTTP/1.0 的默認(rèn)行為是為每個(gè) HTTP 請(qǐng)求/響應(yīng)對(duì)打開一個(gè)單獨(dú)的 TCP 連接。當(dāng)多個(gè)請(qǐng)求連續(xù)發(fā)送時(shí),這比共享單個(gè) TCP 連接效率低。

HTTP 消息

HTTP/1.1 及更早版本中定義的 HTTP 消息是人類可讀的。 在 HTTP/2 中,這些消息被嵌入到二進(jìn)制結(jié)構(gòu)中,即一個(gè)幀,允許像壓縮頭和多路復(fù)用這樣的優(yōu)化。 即使在這個(gè)版本的 HTTP 中只發(fā)送原始 HTTP 消息的一部分,每個(gè)消息的語義都不會(huì)改變,客戶端會(huì)(實(shí)際上)重構(gòu)原始 HTTP/1.1 請(qǐng)求。 因此,理解 HTTP/1.1 格式的對(duì) HTTP/2 消息很有用。

HTTP 消息有兩種類型,請(qǐng)求和響應(yīng),每種都有自己的格式。

HTTP請(qǐng)求消息

請(qǐng)求由以下元素組成:

HTTP 方法,通常是 GET、POST 之類的動(dòng)詞或 OPTIONS 或 HEAD 之類的名詞,用于定義客戶端想要執(zhí)行的操作。 通常,客戶端想要獲取資源(使用 GET)或發(fā)布 HTML 表單的值(使用 POST),但在其他情況下可能需要更多操作。

要獲取的資源的路徑; 從上下文中明顯的元素中剝離的資源的 URL。

HTTP響應(yīng)消息

響應(yīng)由以下元素組成:

他們遵循的 HTTP 協(xié)議的版本。

狀態(tài)碼,指示請(qǐng)求是否成功以及原因。

狀態(tài)消息,狀態(tài)代碼的非權(quán)威簡短描述。

HTTP 標(biāo)頭,例如用于請(qǐng)求的標(biāo)頭。

可選地,包含獲取的資源的主體。

HTTP 狀態(tài)

一些常見的 HTTP 狀態(tài)代碼包括:

 200 - 請(qǐng)求成功(網(wǎng)頁存在)
 301 - 永久移動(dòng)(通常轉(zhuǎn)發(fā)到新 URL)
 401 - 未經(jīng)授權(quán)的請(qǐng)求(需要授權(quán))
 403 - 禁止(不允許訪問頁面或目錄)
 500 - 內(nèi)部服務(wù)器錯(cuò)誤(通常由不正確的服務(wù)器配置引起)

HTTP協(xié)議解析及C/C++代碼實(shí)現(xiàn)

...
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{

    ...

	/* print source and destination IP addresses */
	printf("       From: %s\n", inet_ntoa(ip->ip_src));
	printf("         To: %s\n", inet_ntoa(ip->ip_dst));
	
	/* determine protocol */	
	switch(ip->ip_p) 
	{
		case IPPROTO_TCP:
			printf("   Protocol: TCP\n");
			break;
		case IPPROTO_UDP:
			printf("   Protocol: UDP\n");
			break;
		case IPPROTO_ICMP:
			printf("   Protocol: ICMP\n");
			return;
		case IPPROTO_IP:
			printf("   Protocol: IP\n");
			return;
		default:
			printf("   Protocol: unknown\n");
			return;
	}
	
	/*
	 *  OK, this packet is TCP.
	 */
	
	/* define/compute tcp header offset */
	if(ip->ip_p == IPPROTO_TCP)
	{
        ...
	
		printf("   Src port: %d\n", ntohs(tcp->th_sport));
		printf("   Dst port: %d\n", ntohs(tcp->th_dport));
		int sport = ntohs(tcp->th_sport);
		int dport = ntohs(tcp->th_dport);

        ...
		if (size_payload > 0) 
		{
			printf("   Payload (%d bytes):\n", size_payload);
			//print_payload(payload, size_payload);
		
            if ((sport == 80) || (dport == 80))
			{
				printf("   HTTP prase:\n");
				prase_http(payload, size_payload);
			}
			else if(sport == 443 || dport == 443)
			{
				printf("   SSL/TLS prase:\n");
				prase_ssl_tls(payload, size_payload);
			}
		}
	}
	...

}

int main(int argc, char *argv[])
{
    	
	char errbuf[100];
	pcap_t *desc = 0;
    char *filename = argv[1];
    if (argc != 2)
    {
        printf("usage: ./dissect_http [pcap file]\n");
        return -1;
    }

    printf("ProcessFile: process file: %s\n", filename);
    if ((desc = pcap_open_offline(filename, errbuf)) == NULL)
    {   
        printf("pcap_open_offline: %s error!\n", filename);
        return -1; 
    }   	
	
	
    pcap_loop(desc, -1, got_packet, NULL);

    pcap_close(desc);
    return 0;
}

運(yùn)行結(jié)果:

總結(jié)

HTTP 是一種易于使用的可擴(kuò)展協(xié)議。 客戶端-服務(wù)器結(jié)構(gòu)與添加標(biāo)頭的能力相結(jié)合,允許 HTTP 與 Web 的擴(kuò)展功能一起發(fā)展。

盡管 HTTP/2 通過在幀中嵌入 HTTP 消息來提高性能增加了一些復(fù)雜性,但消息的基本結(jié)構(gòu)自 HTTP/1.0 以來一直保持不變。 會(huì)話流保持簡單,允許使用簡單的 HTTP 消息監(jiān)視器對(duì)其進(jìn)行調(diào)查和調(diào)試。

以“http://”開頭的 URL 通過標(biāo)準(zhǔn)超文本傳輸??協(xié)議訪問,默認(rèn)使用端口 80。以“https://”開頭的 URL 通過安全的 HTTPS 連接訪問,通常使用端口 443。

以上就是C/C++代碼實(shí)現(xiàn)HTTP協(xié)議解析的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++解析HTTP協(xié)議的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++創(chuàng)建多線程的方法總結(jié)

    C++創(chuàng)建多線程的方法總結(jié)

    下個(gè)迭代有個(gè)任務(wù)很有趣,用大量的線程去訪問一個(gè)接口,直至其崩潰為止,這就需要多線程的知識(shí),這也不是什么難事,本文總結(jié)一下C++中的多線程方法std、boost、pthread、windows?api,感興趣的朋友可以參考下
    2024-01-01
  • Qt讀寫ini文件之QSettings用法

    Qt讀寫ini文件之QSettings用法

    這篇文章主要為大家介紹了Qt讀寫ini文件之QSettings的使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Qt編寫地圖之實(shí)現(xiàn)跨平臺(tái)功能

    Qt編寫地圖之實(shí)現(xiàn)跨平臺(tái)功能

    這篇文章主要介紹了如何利用Qt編寫地圖應(yīng)用時(shí)實(shí)現(xiàn)跨平臺(tái)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-02-02
  • Qt創(chuàng)建項(xiàng)目實(shí)戰(zhàn)之手把手創(chuàng)建第一個(gè)Qt項(xiàng)目

    Qt創(chuàng)建項(xiàng)目實(shí)戰(zhàn)之手把手創(chuàng)建第一個(gè)Qt項(xiàng)目

    我們?cè)谶M(jìn)行軟件開發(fā)學(xué)習(xí)時(shí),有時(shí)候需要qt軟件進(jìn)行代碼的敲寫,下面這篇文章主要給大家介紹了關(guān)于Qt創(chuàng)建項(xiàng)目實(shí)戰(zhàn)之手把手創(chuàng)建第一個(gè)Qt項(xiàng)目的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • C語言超詳細(xì)講解棧的實(shí)現(xiàn)及代碼

    C語言超詳細(xì)講解棧的實(shí)現(xiàn)及代碼

    棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素
    2022-04-04
  • 基于C語言實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)

    基于C語言實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言中的鏈接編寫教程

    C語言中的鏈接編寫教程

    這篇文章主要介紹了C語言中的鏈接編寫教程,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C語言快速實(shí)現(xiàn)掃雷小游戲

    C語言快速實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 分享C++三種類型new類型的運(yùn)算符使用詳情

    分享C++三種類型new類型的運(yùn)算符使用詳情

    這篇文章主要介紹了C++三種類型new運(yùn)算符的使用詳情,文章基于C++運(yùn)算展開主題內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • linux下C/C++學(xué)生信息管理系統(tǒng)

    linux下C/C++學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了linux下c/c++學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

灵山县| 法库县| 鄂州市| 奉化市| 那坡县| 丁青县| 左云县| 廊坊市| 台前县| 古田县| 安溪县| 龙岩市| 上杭县| 渝北区| 霍山县| 丰县| 彭山县| 鲁山县| 大田县| 肇庆市| 鄂托克前旗| 武鸣县| 镇平县| 沙河市| 东源县| 富民县| 康马县| 崇信县| 迭部县| 象州县| 乌兰浩特市| 郑州市| 嘉兴市| 丰顺县| 房产| 渝中区| 五大连池市| 安陆市| 巴彦淖尔市| 黄陵县| 宝鸡市|