iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++实现HTTP协议解析的示例代码
  • 640
分享到

C/C++实现HTTP协议解析的示例代码

2024-04-02 19:04:59 640人浏览 薄情痞子
摘要

超文本传输协议 (Http) 是分布式、协作、超媒体信息系统的应用层协议。 这是自 1990 年以来万维网数据通信的基础。HTTP 是一种通用且无状态的协议,它可以用于其他目的,也可

超文本传输协议 (Http) 是分布式、协作、超媒体信息系统的应用层协议。 这是自 1990 年以来万维网数据通信的基础。HTTP 是一种通用且无状态的协议,它可以用于其他目的,也可以使用其请求方法、错误代码和标头的扩展。

基本上,HTTP 是一种基于 tcp/IP 的通信协议,用于通过 WEB 传递 html 文件、图像文件、查询结果等数据。 它为计算机之间的通信提供了一种标准化的方式。 HTTP 规范指定了客户端请求的数据如何发送到服务器,以及服务器如何响应这些请求。

HTTP客户端和服务器通信

客户端和服务器通过交换单独的消息(而不是数据流)进行通信。 客户端(通常是 Web 浏览器)发送的消息称为请求,服务器发送的作为应答的消息称为响应。

HTTP通过 TCP 或 TLS 加密的 TCP 连接发送的应用层协议,尽管理论上可以使用任何可靠的传输协议。 由于其可扩展性,它不仅用于获取超文本文档,还用于获取图像和视频或将内容发布到服务器,例如 HTML 表单结果。 HTTP 还可用于获取部分文档以按需更新网页。

HTTP和连接

连接是在传输层控制的,因此基本上超出了 HTTP 的范围。 HTTP 不要求底层传输协议是基于连接的;

它只要求它是可靠的,或者不丢失消息。在 Internet 上最常见的两种传输协议中,TCP 是可靠的,而 UDP 则不是。因此,HTTP 依赖于基于连接的 TCP 标准。

在客户端和服务器可以交换 HTTP 请求/响应对之前,它们必须建立 TCP 连接,这个过程需要多次往返。

HTTP/1.0 的默认行为是为每个 HTTP 请求/响应对打开一个单独的 TCP 连接。当多个请求连续发送时,这比共享单个 TCP 连接效率低。

HTTP 消息

HTTP/1.1 及更早版本中定义的 HTTP 消息是人类可读的。 在 HTTP/2 中,这些消息被嵌入到二进制结构中,即一个帧,允许像压缩头和多路复用这样的优化。 即使在这个版本的 HTTP 中只发送原始 HTTP 消息的一部分,每个消息的语义都不会改变,客户端会(实际上)重构原始 HTTP/1.1 请求。 因此,理解 HTTP/1.1 格式的对 HTTP/2 消息很有用。

HTTP 消息有两种类型,请求和响应,每种都有自己的格式。

HTTP请求消息

请求由以下元素组成:

HTTP 方法,通常是 GET、POST 之类的动词或 OPTioNS 或 HEAD 之类的名词,用于定义客户端想要执行的操作。 通常,客户端想要获取资源(使用 GET)或发布 HTML 表单的值(使用 POST),但在其他情况下可能需要更多操作。

要获取的资源的路径; 从上下文中明显的元素中剥离的资源的 URL。

HTTP响应消息

响应由以下元素组成:

他们遵循的 HTTP 协议的版本。

状态码,指示请求是否成功以及原因。

状态消息,状态代码的非权威简短描述。

HTTP 标头,例如用于请求的标头。

可选地,包含获取的资源的主体。

HTTP 状态

一些常见的 HTTP 状态代码包括:

 200 - 请求成功(网页存在)
 301 - 永久移动(通常转发到新 URL)
 401 - 未经授权的请求(需要授权)
 403 - 禁止(不允许访问页面或目录)
 500 - 内部服务器错误(通常由不正确的服务器配置引起)

HTTP协议解析及C/C++代码实现

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

    ...

	
	printf("       From: %s\n", inet_ntoa(ip->ip_src));
	printf("         To: %s\n", inet_ntoa(ip->ip_dst));
	
		
	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;
	}
	
	
	
	
	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;
}

运行结果:

总结

HTTP 是一种易于使用的可扩展协议。 客户端-服务器结构与添加标头的能力相结合,允许 HTTP 与 Web 的扩展功能一起发展。

尽管 HTTP/2 通过在帧中嵌入 HTTP 消息来提高性能增加了一些复杂性,但消息的基本结构自 HTTP/1.0 以来一直保持不变。 会话流保持简单,允许使用简单的 HTTP 消息监视器对其进行调查和调试。

以“http://”开头的 URL 通过标准超文本传输​​协议访问,默认使用端口 80。以“https://”开头的 URL 通过安全的 HTTPS 连接访问,通常使用端口 443。

以上就是C/C++代码实现HTTP协议解析的示例代码的详细内容,更多关于c++解析HTTP协议的资料请关注编程网其它相关文章!

--结束END--

本文标题: C/C++实现HTTP协议解析的示例代码

本文链接: https://www.lsjlt.com/news/164861.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++实现HTTP协议解析的示例代码
    超文本传输协议 (HTTP) 是分布式、协作、超媒体信息系统的应用层协议。 这是自 1990 年以来万维网数据通信的基础。HTTP 是一种通用且无状态的协议,它可以用于其他目的,也可...
    99+
    2022-11-13
  • HTTP协议消息头的示例代码
    这篇文章主要介绍HTTP协议消息头的示例代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!host=gray-scp-getway.9fbank.comx-real-ip=222.129.11.74x-forward...
    99+
    2023-06-05
  • C/C++ QT实现解析JSON文件的示例代码
    JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据,简洁清晰的的层次结构使得JSON成为理想的数据交换语言,...
    99+
    2022-11-12
  • 怎么解析C#网络编程中的HTTP协议
    这篇文章将为大家详细讲解有关怎么解析C#网络编程中的HTTP协议,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是...
    99+
    2023-06-17
  • C++实现MyString的示例代码
    MyString的构造、析构、拷贝构造、赋值运算 class String { char* str; public: String(const char* p = NULL) :...
    99+
    2022-11-13
  • Java HTTP协议收发MQ 消息代码实例详解
    1. 准备环境在工程 POM 文件添加 HTTP Java 客户端的依赖。<dependency> <groupId>org.eclipse.jetty</groupId> <artifactI...
    99+
    2023-05-31
    java http协议 mq
  • C/C++实现精灵游戏的示例代码
    目录前言创建win32项目游戏效果核心代码前言 采用面向过程的遍程思想,通过acllib图形库来实现。 acllib下载地址:acllib tom,jerry,dog,heart以及...
    99+
    2022-11-13
  • C/C++实现蛇形矩阵的示例代码
    目录题目描述题解部分完整代码菜鸡蒟蒻想在博客中记录一些算法学习的心得体会,会持续更新C/C++方面的题解,方便理清思路和日后复习。如果还能结识一起敲代码的小伙伴的话就更好啦嘿嘿,因为...
    99+
    2022-11-12
  • C/C++ Qt 运用JSON解析库的实例代码
    JSON是一种简单的轻量级数据交换格式,Qt库为JSON的相关操作提供了完整的类支持,使用JSON解析文件之前需要先通过TextStream流将文件读入到字符串变量内,然后再通过QJ...
    99+
    2022-11-12
  • C/C++实现线性顺序表的示例代码
    目录线性顺序表简介C语言实现代码C++语言实现代码线性顺序表简介 使用顺序存储结构的线性存储结构的表为线性顺序表,线性存储结构是元素逻辑结构一对一,顺序存储结构是元素物理结构连续,线...
    99+
    2022-11-13
  • C/C++实现线性单链表的示例代码
    目录线性单链表简介C语言实现代码C++语言实现代码线性单链表简介 使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,线性单链...
    99+
    2022-11-13
  • C++ 实现桶排序的示例代码
    目录原理实现步骤:模拟生成整数随机数桶排序实现完整版可运行程序时间复杂度计算桶排序:整数  原理 原理简述:按照需要排序数组的实际情况,生成一个一定长度的一维数组,用于统计...
    99+
    2022-11-12
  • C语言实现栈的示例代码
    目录一、了解栈的结构特点二、具体实现补充 栈的用处一、了解栈的结构特点 栈是一种特殊的线性表,只允许从一端进出数据,称为后进先出,先进后出。 压栈:栈的插入操作叫做进栈/压...
    99+
    2022-11-13
  • C++实现Dijkstra算法的示例代码
    目录一、算法原理二、具体代码1.graph类2.PathFinder类3. main.cpp三、示例一、算法原理 链接: Dijkstra算法及其C++实现参考这篇文章 二、具体代码...
    99+
    2022-11-13
  • C#实现ComboBox变色的示例代码
    目录实践过程效果代码实践过程 效果 代码 public partial class B_ComboBox : ComboBox { public B_...
    99+
    2023-01-05
    C#实现ComboBox变色 C# ComboBox变色 C# ComboBox
  • C++模拟实现vector的示例代码
    目录1.前言2.vector介绍3.vector模拟实现3.1 迭代器接口3.2 vector元素操作3. 3 构造与析构1.前言 大家在学习C++的时候一定会学到STL(标准模板库...
    99+
    2022-11-13
  • c++实现堆排序的示例代码
    看了一下优先队列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交换2个操作。如果建的是最大堆,那么交换的时候,父节点就和最大的子节点比较,如果它比最大的子节点还大,那就不用比了...
    99+
    2023-02-02
    c++ 堆排序
  • c#实现flv解析详解示例
    下面是一个使用C#实现FLV解析的示例代码:```csharpusing System;using System.IO;public...
    99+
    2023-08-16
    C#
  • C#实现HTTP访问类HttpHelper的示例详解
    在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了。示例中的HttpHelper类使用Lo...
    99+
    2022-11-13
  • C/C++实现经典象棋游戏的示例代码
    目录大体思路效果展示核心代码大体思路 采用面相过程的设计方式实现,类似于我们平时做的课程设计,实现这样的小游戏无非就是多了图形处理库。这里使用的是acllib图形库。 设计这种小游戏...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作