Hsia Blog

发现更大的世界

select、poll、epoll之间的区别

(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以 select具有O(n)的无差别轮询复杂度 ,同时处理的流越多,无差别轮询时间就越长。 (2)poll==>时间复杂度O(n) poll本质上和select没...

Trojan原理简单分析

背景 偶然听说了trojan这个扶墙工具,了解到它跟v2ray的ws+tls的方式类似,都使用了真正的https,这点跟我的喜好相符,个人以为最稳的扶墙方式便是这种真实https的方式,倘若自己再有一个网站,隐藏在网站后面,那真的是非常非常的稳。 由于自己对这种扶墙方式比较感兴趣,所以希望了解下其实现的原理,先前有大概瞟过v2ray的源码,但它的源码比较复杂,没有深入去看,而trojan...

[C++] 阻止类被继承(继承类被实例化)的几种常用办法

不时会留意到有人问起如何阻止 C++ 中的类被继承,但多数人都没有把这个问题问对。 在 C++11 标准之前,阻止类被继承在语法上是做不到的,大家通常做到的只是继承而来的类不能被实例化了。这样一来,继承得到的类就完全没有用了。虽然最终的效果一致,但对问题的理解其实是有差异的。 从 C++11 标准开始,C++ 引入了一个新的关键字 final,只有被 final 修饰的类才能真正做到不能...

常见排序算法

LeetCode 912. 排序数组 sort-an-array 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 5...

理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

TCP标志位syn,ack,fin以及序列号(seq),响应号(ack)

一、概念及作用 TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收。 二、TCP三次握手 TCP标志位 TCP在其协议头中使用大量的标志位或者说1位(bit)布尔域来控制连接状态,一个包中有可以设置多个标志位。 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三...

C++ 11之Lambda表达式

C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数,用以替换独立函数或者函数对象,并且使代码更可读。但是从本质上来讲,lambda表达式只是一种语法糖,因为所有其能完成的工作都可以用其它稍微复杂的代码来实现。但是它简便的语法却给C++带来了深远的影响。如果从广义上说,lamdba表达式产生的是函数对象。在类中,可以重载函数调用运算符(),此...

c++中map与unordered_map的区别

头文件 map: #include <map> unordered_map: #include <unordered_map> 内部实现机理 map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操...

一个TCP连接上面能发多少个HTTP请求

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢? 要搞懂这个问题,我们需要先解决下面五个问题: 现代浏览器在与服务器建立了一个 TCP ...

TCP短连接和长连接的区别

TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情...

基于 Boost Asio 的 C++ 网络编程

基于 Boost Asio 的 C++ 网络编程 环境: Boost v1.66, VS 2013 & 2015 说明: 这篇教程形成于 Boost v1.62 时代,最近(2018/01)针对 v1.66 做了一次大的更新。 此外,在代码风格上,C++11 用得更多了。 概述 近期学习 Boost Asio,依葫芦画瓢,写了不少例子,对这个「轻量级」的网络库算是有了一定...