IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> pair、tuple 8.10 -> 正文阅读

[网络协议]pair、tuple 8.10

今日学习:

pair

C++中的结构模板,定义在头文件<utility>中,提供一个包含2个数据成员的结构体模板。

pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair。

(1)STL中的map就是将key和value放在一起来保存。

(2)另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair

pair的创建和初始化

pair<string, string> anon;        // 创建一个空对象anon,两个元素类型都是string
pair<string, int> word_count;     // 创建一个空对象 word_count, 两个元素类型分别是string和int类型
pair<string, vector<int> > line;  // 创建一个空对象line,两个元素类型分别是string和vector类型

pair<string, string> author("James","Joy");    // 创建一个author对象,两个元素类型分别为string类型,并默认初始值为James和Joy。
pair<string, int> name_age("Tom", 18);
pair<string, int> name_age2(name_age);    // 拷贝构造初始化
pair<float,string> p2={1.0,"today"};



pair<int, double> p1(1, 1.2);
pair<int, double> p2 = p1;     // copy construction to initialize object
pair<int, double> p3;
p3 = p1;    // operator =


pair<int ,double> p1;
p1.first = 1;
p1.second = 2.5;
cout<<p1.first<<' '<<p1.second<<endl;

利用make_pair创建新的pair对象


 pair<int, double> p1;
 p1 = make_pair(1, 1.2);
 cout << p1.first << p1.second << endl;

 
 pair<int,double> p2 = make_pair(12,3.14);

通过tie获取pair元素值

pair<int,int> Function(){
    return make_pair(1,2);
}

int main(){
    int a,b;
    tie(a,b)=Function();
    cout<<a<<b<<endl;
    return 0;
}

tuple

tuple即元组,可以理解为pair的扩展,可以用来将不同类型的元素存放在一起,常用于函数的多返回值。

定义与初始化

tuple<int,double,string> t={1,2.0,"3"};

tuple<int,double,string> t1(1,13.1,"MIKE");

tuple<int,float,char> t2 = make_tuple(2,15.6,'a');

?获取tuple内的值

tuple<int,float,char> t3=make_tuple(2,12.0,'b');
cout << get<0>(t3) <<endl;
cout << get<1>(t3) <<endl;
cout << get<2>(t3) <<endl;

int tt1;
float tt2;
char tt3;
tie(tt1,tt2,tt3)=t3;
cout<<tt1<<tt2<<tt3<<endl;

一些混用

     auto t1 = make_tuple( 1 , "a1" , "b1" , "c1" );
     cout << get< 0 >(t1) << " " ;
     cout << get< 1 >(t1) << " " ;
     cout << get< 2 >(t1) << " " ;
     cout << get< 3 >(t1) << " " ;
     cout << endl;
     

     vector<tuple< int , string= "" string,= "" > > tv;
     tv.push_back(make_tuple( 1 , "a1" , "b1" , "c1" ));
     tv.push_back(make_tuple( 2 , "a2" , "b2" , "c2" ));
     
     vector<tuple< int , string= "" string,= "" > >::iterator itr;
     for (itr=tv.begin(); itr!=tv.end(); itr++)
     {
         cout << get< 0 >(*itr) << " " ;
         cout << get< 1 >(*itr) << " " ;
         cout << get< 2 >(*itr) << " " ;
         cout << get< 3 >(*itr) << endl;
     }

C++11 引入了nullptr关键字

nullptr在C++11中就是代表空指针,不能被转换成数字,不同于NULL,专门用来区分空指针、0


C++11常用新特性快速一览_jiange_zh的博客-CSDN博客_c++11新特性


套接字

TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。

套接字用(IP地址:端口号)表示。

生成套接字,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。

要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。???

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。?????
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

?TCP粘包/拆包

粘包、拆包发生原因

?发生TCP粘包或拆包有很多原因,现列出常见的几点,可能不全面,欢迎补充,

?1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。

?2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。

?3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。

?4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

?等等。

粘包、拆包解决办法

?通过以上分析,我们清楚了粘包或拆包发生的原因,那么如何解决这个问题呢?解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下几个:

?1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

?2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

?3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。


HTTP长连接、短连接

HTTP的长连接和短连接本质上是TCP长连接和短连接。

HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:??

?Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

?HTTP长连接、短连接究竟是什么?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:47:32  更:2021-08-11 12:47:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:32:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码