网络编程 1 相关基础概念 及 请求、响应类 定义

news2024/12/22 17:04:12

目录

一、HTTP基本概念

1、HTTP是什么

2、HTTP客户端是什么

3、HTTP消息结构

 4、服务器响应信息

二、相关概念

1、网址 URL

2、IP地址

3、域名

4、域名与IP关系

5、域名解析

6、DNS

三、设计请求、响应类基本数据结构

1、请求类定义

2、响应类定义


一、HTTP基本概念

1、HTTP是什么

HTTP(HyperText Transfer Protocol)是一种用于从互联网服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,是一种发布和接收HTML页面的标准。

2、HTTP客户端是什么

HTTP客户端是一个应用程序,用于发送HTTP请求并接收响应。它可以是一个Web浏览器,如Google Chrome或Mozilla Firefox,也可以是一个命令行工具,如curl或wget。

3、HTTP消息结构

HTTP消息由请求行、请求头、空行和请求体4部分组成。

1). 请求行:包含请求方法、URL和HTTP协议版本;

2). 请求头:包含客户端信息、内容信息等;

3). 空行:用来分隔请求头和请求体;

4). 请求体:包含客户端发送的数据。

消息请求实例如下:


POST / HTTP/1.1 
Host: www.example.com 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 32 
Connection: keep-alive 
Accept: */* 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 
Accept-Encoding: gzip, deflate, br 
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 
Cookie: _ga=GA1.2.2045678901234567890; _gid=GA1.2.2045678901234567890; _gat_gtag_UA_1234567890_1=1 

name=John&age=20

 4、服务器响应信息

服务器响应由以下几部分组成:

1). 状态行:包含HTTP协议版本、状态码和描述信息,例如:HTTP/1.1 200 OK

2). 响应头:包含服务器端的一些信息,例如Content-Type、Content-Length等。

3). 空行:用来分隔响应头和响应体。

4). 响应体:包含客户端请求的资源内容。

响应消息实例如下:

HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 
Content-Length: 1234 
Connection: keep-alive 
 
<html> 
    <head> 
        <title>Example</title> 
    </head> 

    <body> 

        <h1>Hello World!</h1>

    </body> 
</html>

二、相关概念

1、网址 URL

URL(Uniform Resource Locator)是一种资源定位符,用于定位互联网上的资源。

它是一个全球通用的字符串,可以用来标识一个特定的网页、图像、文件或其他资源。

一个完整的URL包括:

协议(Protocol)、域名(Domain Name)、端口号(Port Number)、路径(Path)和参数(Parameters)。

例如:https://www.example.com:8080/path/to/file?param1=value1&param2=value2

2、IP地址

IP 地址(Internet Protocol Address)是一种用于在计算机网络中定位设备的地址。

它是一个32位的二进制数字,通常表示为4个以句号分隔的十进制数字(例如192.168.1.1)。

3、域名

IP 地址不好记忆,因此出现了域名(Domain Name)

4、域名与IP关系

IP 地址是一个由四个数字组成的字符串,用于标识计算机在 Internet 上的位置。而域名则是一个可以被人们记忆的名字,它可以把 IP 地址映射到一个可读性更强的名字上。

IP 地址与域名是一对多的关系。一个 IP 地址可以对应多个域名,但一个域名只有一个 IP 地址。

5、域名解析

域名虽然便于人们记忆,但机器之间互相只认识 IP 地址,它们之间的转换工作称为域名解析,由专门的域名解析服务器DNS完成。

6、DNS

DNS(Domain Name System)是一种用于将域名转换成IP地址的分布式数据库系统。它是一个分布式的、层次化的、可扩展的数据库,用于存储和检索域名与IP地址之间的映射关系。

三、设计请求、响应类基本数据结构

以下是我项目中使用的数据结构,只是为了帮助理解其中主要思想,并不一定适合别的项目。

1、请求类定义

typedef std::map<std::string,std::string> MAPSTRSTR;

class HTTPD_API CHttpRequest
{
	char	m_host[64];
	char	m_method[8];
	char	m_uri[1023];
    char    m_ssl;
	MAPSTRSTR*	m_map;
	MAPSTRSTR*	m_mParam;

	
    
public:
    CHttpRequest() {
        m_ssl=0;
        m_map=m_mParam=0;
    }
    // host:port, GET|POST, /aaa/aaa.html?query_string
	CHttpRequest(const char* host,const char* method,const char* uri) {
        m_ssl=0;
        m_map=m_mParam=0;
        Set(host,method,uri);
	}
	~CHttpRequest() {
		if(m_map) {
			delete m_map;
			m_map=0;
		}
		if(m_mParam) {
			delete m_mParam;
			m_mParam=0;
		}
	}
    // http[s]://host:port/abc.html?query_string, GET|POST
    void Set(const char* url,const char* method);
    // host:port, GET|POST, /aaa/aaa.html?query_string
    void Set(const char* host,const char* method,const char* uri) {
        strcpyN(m_host,host,sizeof(m_host));
        strcpyN(m_method,method,sizeof(m_method));
        strcpyN(m_uri,uri,sizeof(m_uri));
    }

    int IsSsl() const { return m_ssl; }
    void SetSsl(int ssl) { m_ssl = ssl; }
    int GetHostPort(char* szHost, int size) const;
    // header
	void AddPair(const char* key,const char* v) {
		if(!m_map) m_map=new MAPSTRSTR;
		(*m_map)[key]=v;
	}
    
    // query_string
	void AddParam(const char* key,const char* v) {
		if(!m_mParam) m_mParam=new MAPSTRSTR;
		(*m_mParam)[key]=v;
	}
	const char* Format(CBinBuf& req,const char* ctype,const char* data,int l);


   const char* GetURL()
	{
		return m_uri;
	}

   const char* GetHost()
	{
		return  m_host;
	}

   const char* Method()
	{
		return m_method;
	}
};

//	return
//		0:	http
//		1:	https
HTTPD_API int http_parse_hostport(const char* url, char* host, int hsize, int& port, char* uri, int usize);

void CHttpRequest::Set(const char* url,const char* method)
{
    char    host[128],uri[256];
    int     port;
    int ssl = http_parse_hostport(url,host,sizeof(host),port,uri,sizeof(uri));
    if(!method) method="GET";
    
    char    szHost[256];
    if(port==80 || port==443) strcpy(szHost,host);
    else sprintf(szHost,"%s:%d",host,port);
    
    Set(szHost,method,uri);
    m_ssl = ssl;
}

2、响应类定义

// when act as http client or http server.
class HTTPD_API CHttpResponse
{
	MAPSTRSTR	m_map;
#ifdef ENABLE_HTTP2
    const char* FormatV2(int code,MAPSTRSTR& mheader,const char* data=0,int len=0,int bHead=0,uint64_t ctlen=0);
public:
    CBinBuf     m_v2Body;
#endif
    
public:
    char        m_v2;
    CBinBuf     m_bf;

public:
    CHttpResponse(int v2=0) {
        m_v2 = v2;
    }
	void AddPair(const char* key,const char* v) {
		m_map[key]=v;
	}
	const char* Format(int code,const char* reason,int keepalive,const char* data=0,int len=0,int bHead=0,uint64_t ctlen=0);
    const char* Format(int code,const char* reason,int keepalive,MAPSTRSTR& mheader,const char* data=0,int len=0,int bHead=0,uint64_t ctlen=0);
};

Format主要用于格式化响应信息

const char* CHttpResponse::Format(int code,const char* reason,int keepalive,MAPSTRSTR& mheader,const char* data,int len,int bHead,uint64_t ctlen)
{
    if(!ctlen) ctlen=len;
#ifdef ENABLE_HTTP2
    if(m_v2) {
        return FormatV2(code, mheader, data, len, bHead, ctlen);
    }
#endif
	// Status-Line
	m_bf.Format("HTTP/1.1 %03d %s\r\n",code,reason);
	// Date
	char szTm[32];
	m_bf.AppendFormat("Date: %s\r\n",rfc1123_date(time(0),szTm));
	// Server
	m_bf.AppendFormat("Server: banhttpd/%s\r\n",g_httpd_ver);
	m_bf.AppendFormat("X-Frame-Options: SAMEORIGIN\r\n");
	if(keepalive) {
		m_bf.Append("Connection: Keep-Alive\r\nKeep-Alive: timeout=5, max=100\r\n");
	} else {
		m_bf.Append("Connection: close\r\n");
	}
	// Content-Type
	if(mheader.find("Content-Type")!=mheader.end()) {
		m_bf.AppendFormat("Content-Type: %s\r\n",mheader["Content-Type"].c_str());
	}
	// Content-Length
	m_bf.AppendFormat("Content-Length: %llu\r\n",ctlen);
	for(MAPSTRSTR::iterator it=mheader.begin();it!=mheader.end();++it) {
		if( strcmp(it->first.c_str(),"Content-Type")==0
		   || strcmp(it->first.c_str(),"Content-Length")==0)
		{
			continue;
		}
		m_bf.AppendFormat("%s: %s\r\n",it->first.c_str(),it->second.c_str());
	}
	// end header
	m_bf.Append("\r\n",2);
	// body
	if(!bHead) m_bf.Append(data,len);
	m_bf.ReleaseBuffer();
	return m_bf.GetPtr();
}

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

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

相关文章

AD引脚交换

19年写过一篇AD交换引脚的文章&#xff0c;原文请查阅AD18调PIN方法及注意事项&#xff0c;该方法是手动更改焊盘的网络&#xff0c;如果是对于少量的或者零散的引脚交换还好&#xff0c;但遇到像FPGA、CPLD或者端子这种大量引脚需要调PIN的情况还是一个一个手动更改就很费时了…

java 微服务 RabbitMQ高级 消息可靠性问题 死信交换机 延迟队列 惰性队列

消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性问题&#xff08;面试很会问&#xff09; 针对这些问题&#xff0c;RabbitMQ分别给出了解决方案&#xff1a; 生产者确认机制 mq持久化 消费者确认机制 失败重试机制 下面我们就通过案…

基于Android的办公用品管理平台的设计与实现

需求信息&#xff1a; 教师端&#xff1a; &#xff08;1&#xff09;注册登录&#xff1a;教师通过输入自己的工号和密码登录系统&#xff1b; &#xff08;2&#xff09;信息修改&#xff1a;教师可以完善个人信息&#xff08;院系、职务等&#xff09;&#xff1b; &#xf…

DMS感知方案前装赛道「排位」,2025年750万辆市场争夺

对舱内驾驶员、乘客的关怀&#xff0c;正在成为车企新一轮体验升级的关键突破口。在2023年CES展上&#xff0c;类似的产品方案也成为汽车行业的焦点。 比如&#xff0c;一家名为Myant的创新材料技术公司&#xff0c;在今年CES期间推出了一款将传感器和执行器&#xff08;与编织…

深度解刨性能测试工具Locust

An open source load testing tool. 一个开源性能测试工具。 define user behaviour with python code, and swarm your system with millions of simultaneous users. 使用Python代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统。 如果你常关注我的博客&…

2022尚硅谷SSM框架跟学(十)SSM整合

2022尚硅谷SSM框架跟学 十 SSM整合四、SSM整合4.1ContextLoaderListener(1).创建Maven Module(2).导入依赖(3).配置web.xml(4).创建SpringMVC的配置文件并配置(5).创建Spring的配置文件并配置(6).创建组件(7).创建页面(8).访问测试功能4.2准备工作(1).创建Maven Module(2).导入…

【2023亲测可用】JS 获取电脑本地IP 和 电脑网络IP(外网IP|公网IP)

1、了解&#xff1a;电脑本地的IP地址&#xff08;内网IP&#xff09;和电脑本机在网络上的IP地址&#xff08;外网IP|公网IP&#xff09; 在运行窗口输入“cmd”&#xff0c;在弹出的界面里输入“ipconfig/all”。弹出的数据中&#xff0c;IPv4地址&#xff0c;就是电脑本地的…

使用Hadoop分析气象数据(附代码)

刚学了Hadoop&#xff0c;在网上找完整的分析使用过程进行练手观看。本文数据和方法均来自于大佬的使用Hadoop分析气象数据完整版&#xff08;附带完整代码&#xff09;&#xff08;侵删&#xff09; 文章目录1.获取数据1.1下载数据1.2 数据格式1.3 合并数据2.MapReduce处理数据…

01sklearn-机器学习的几种算法(附代码)

说明: 本篇文章主要写了机器学习的流程及一些常用的算法如: 贝叶斯,朴素贝叶斯,线性回归,决策树,随机森林,逻辑斯蒂回归,模型调优和特征工程等(都是使用python的sklearn库实现) 一、概述 二、 一、特征工程 在看下面的算法之前,我们要先对机器学习流程进行一下熟悉! 主要有…

代码随想录算法训练营第五十九天_第九章_动态规划 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

LeetCode 583. 两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 视频讲解https://www.bilibili.com/video/BV1we4y157wB/?spm_id_from333.788&vd_sourcef…

瑞斯拜词汇课第一讲

英语词汇 第一段 1、under the weather 身体不舒服 2、billion 十亿 3、suffer from 遭受 4、high blood pressure 高血压 high blood pressure 高血压 hypertension 高血压 hyper 紧张的5、take steps to do sth 采取措施做某事 take measures to 采取措施 take steps to …

NVME_PCIE_SATA_AHCI_M.2_2.5“

SATA和PCIe两个都是总线标准。它们是并列发展的关系&#xff0c;并不是谁取代谁的关系。 SATA&#xff1a;由IDE/PATA标准发展而来&#xff0c;主要用途是把存贮设备&#xff08;硬盘&#xff09;连接到主机&#xff08;主板&#xff09;。 SATA经历了如下版本&#xff1a; SA…

数影周报:小米汽车供应商被罚100万,1688延迟下线“1688买家旺旺”

本周看点&#xff1a;小米汽车供应商被罚100万&#xff1b;特斯拉将在硅谷招聘AI 人才&#xff1b;阳光出行等25款 App涉违规收集使用个人信息等&#xff1b;1688延迟于2月8日下线“1688买家旺旺”&#xff1b;微蚁科技完成数千万元B轮融资......数据安全那些事小米汽车供应商被…

机器学习实战教程(四):从特征分解到协方差矩阵:详细剖析和实现PCA算法

1. 协方差 概念 方差和标准差的原理和实例演示&#xff0c;请参考 方差 方差&#xff08;Variance&#xff09;是度量一组数据的分散程度。方差是各个样本与样本均值的差的平方和的均值&#xff1a; 标准差 标准差是数值分散的测量。 标准差的符号是 σ &#xff08;希腊…

【redis6】第十五章(应用问题解决)

缓存穿透 问题描述 key对应的数据在数据源并不存在&#xff0c;每次针对此key的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。比如用一个不存在的用户id获取用户信息&#xff0c;不论缓存还是数据库都没有&#xff0c;若黑客利用此漏洞…

Yolov5环境部署步骤记录

目录1.Anaconda1.1 虚拟环境1.1.1 虚拟环境手动配置Pytorch库2.Pycharm社区版2.1 Yolov5源码下载2.2 Pycharm设置3. Yolov53.1 安装所需的插件3.2 运行detect.py1.Anaconda 安装&#xff0c;Anaconda3-5.3.1-Windows-X86_64.exe&#xff0c;装好之后&#xff1b; 配置环境变量…

Code:美团代码托管平台的演进与实践

美团代码托管平台经过长期的打磨&#xff0c;完成了分布式架构的改造落地&#xff0c;托管数以万计的仓库&#xff0c;日均Git相关请求达到千万级别。本文主要介绍了美团代码托管平台在迭代演进过程中面临的挑战及解决思路&#xff0c;希望对大家有所帮助或启发。 1. 引言 2. …

六: 数 组(eclipse的使用)

目录复习隐藏eclipse中的工程3.2 一维数组的使用&#xff1a;数组元素的引用p103.2 一维数组的使用&#xff1a;数组元素的默认初始化值p123.2 一维数组的使用p213.2 一维数组的使用p223.3 多维数组的使用p243.3 多维数组的使用p25引用类型的变量&#xff0c;保存的要么是地址值…

国际标准下载的几个网站 请点赞收藏

名称以ITU开头的国际标准下载网站名称以ITU开头的国际标准&#xff0c;是国际电信联盟组织制定的国际标准。国际电信联盟组织简称国际电联。它的官网是http://www.itu.int。 通过在这个网站下输入标准的部门名称就可以搜索下载电信标准。已ITU Q.763为例打开官网输入标准名称点…

C++11 类的新功能

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11类的新功能和一些关键字 类的新功能类的新功能默认成员函数类成员变量的初始化C11新关键字defaultdeletefinaloverride类的新功…