存档

作者存档

关于 enable_shared_from_this

2019/05/16 64

一. 引入

简单地说: enable_shared_from_this 是为了解决 在类的内部获取自己的 shared_ptr 这件事情而存在的。

众所周知, 每一个对象都能通过this 指针来访问自己的地址。this 指针也是所有成员函数的隐含参数。然而有些时候,我们需要的不仅是 this,而是一个 “this的智能指针”。

这里有一个常见的场景:

代码如上:在异步方法 DoSth_Async() 中调用了成员方法 OnDo(bool) . 这里存在一个问题: 当 OnDo() 被调用的时候,该类的是否还在生存中:

智能指针 ptr 在出作用域后立即被释放。所以当 OnDo() 被调用的时候,其所在的对象实际已经被释放了。如果确保在 OnDo() 被调用的时候,该对象仍然在生命周期内呢?一个方便的方法便上在构建线程的时候,将该对象的 shared_ptr 传入到线程。在该线程的生命周期内,该对象就会一直存在。这是一种利用 shared_ptr 的 保活机制

阅读全文…

使用 Windows API 设置 IE 代理

2019/05/06 48

设置 IE 代理有多种方法。常用的是修改注册表和调用 InternetSetOption API 。

1. 注册表

IE 设置在注册表中所在的位置是
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
其中:

  • ProxyServer
    Value Type: REG_SZ
    Value Data: “ProxyServerName:Port”
  • ProxyEnable
    Value Type: REG_DWORD
    Value Data: 0 = Disable 1 = Enable
  • ProxyOverride 不使用代理的地址的列表
    Value Type: REG_SZ
    Value Data: “list_of_exclusion” 。可以使用通配符 * . 使用分号 ; 分隔, 如 192.168.1.*;*.domain.com;<local>

2. 使用 Windows API

示例代码如下 :

关于更多的信息请 参考这里 docs.microsoft.com

3.Others

a. 注意事项

在 IE9 之前, 以上步骤之后可能需要重启 IE 才能使设置生效。或者在打开 “Internet 属性” 面板时设置不生效。此时需要:

来通知其它应用IE属性被修改。

b. 打开 “Internet 属性” 设置面板

Rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,4
Rundll32 可以做很多事情。具体可以看这里 List of Rundll32 Commands in Windows 10

TCP 的状态:(一) TCP有限状态机 (FSM)

2019/03/14 247

最近一段时间在解决一个网络方面的 BUG,发现自己对 TCP 的状态了解得不够,于是复习了一遍 TCP 的各种状态与状态间的转换,并做了一个整理,以加深自己的理解。

网络上的两台设备想要一起工作,就必须使用相同的网络协议。像 TCP 这种复杂的协议,我们很难简洁地描述其各种确切的操作。所以我们试图使用有限状态机来解释这个复杂的协议。

一. 有限状态机

有限状态机 (FSM : Finite State Machine) 又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。FSM 的四个基本概念如下:

  1. 状态 state: 描述机器在特定时间上处于的 环境(circumstance)或状况(status)
  2. 转换 Transition: 从一种状态到另一种状态的行为(act)
  3. 事件 Event: 导致状态发生变化的事情
  4. 动作 Action: 机器从一种状态转换之前对事件所做的响应

FSM通过解释协议可以处于的所有不同状态、可以在每个状态中发生的事件、针对事件采取的操作以及结果发生的转换来描述协议。协议通常在第一次运行时以特定的开始状态启动。尔后,它遵循一系列步骤使其进入常规操作状态,并根据特定类型的输入或其他情况移动到其他状态。状态机之所以称为有限状态机,是因为只有有限数量的状态。

二. TCP 的操作与状态

对于 TCP 来说,可以使用 FSM 来描述一个连接的生命周期 : 一个 TCP 设备和另一个 TCP 设备之间的每个连接,都从一个空状态(null state) 开始,经过一系列的状态变化,直到建立了(established)连接。然后它将保持这种状态,直到遇到某种事件,它将进行一系列状态直到回到关闭状态。
我们使用三个缩写词来表示状态间转换的三种类型消息,它们对应于 TCP 头的标志。(关于 TCP 头的内容可以参见我之前的博客 《TCP 协议概述》) :

阅读全文…

跨平台工程构建:CMake 的使用(三) 引入库

2019/03/01 225

前一章介绍了 cmake 的基本语法 以及如何构建一个最简单的工程。这里接着聊一聊使用 cmake 构建工程的常用操作:添加库

一、由源代码添加库

这一节中我们将向工程中添加一个库项目。

假设我们需要开发一个 mathlib 库, 并在其他项目中调用,可以像下面这样操作:

 

1. 在工程路径下建立子文件夹 mathlib

2. 在 ./mathlib 中添加项目源文件 mymath.h , mymath.cxx,并添加 CMakeLists.txt:

阅读全文…

跨平台工程构建:CMake 的使用 (二)基本语法

2019/02/20 383

组织结构

cmake 文件包括 CMakeLists.txt 和以 .cmake 为后缀的文件。
程序源文件最外层的 CMakeLists.txt 文件是 cmake 的入口文件,这个文件可以定义了整个工程的构建规范。它也可以使用 add_subdirectory() 命令来包含一个子文件夹,每个使用该命令添加的子文件夹中也需要有一个 CMakeLists.txt 文件。

变量

变量的包装与展开

在 cmake 中, 变量都是以字符串的形式存在的。使用 set( ) 包装变量, 使用 ${} 展开变量。${} 可以嵌套使用。 使用未包装的变量会导致空展开:

执行结果如下:

列表

阅读全文…

跨平台工程构建:CMake 的使用 (一)

2019/02/16 359

什么是 CMake

当我们在构建工程时,在不同的平台上使用不同的工具,如在Windows上使用 Visual Studio 工程, 在 Mac 上使用 Xcode 工程。

这些工程只限于特定的平台。当我们需要跨平台构建工程时,就需要使用 CMake 了,它是一个开源的 跨平台系统构建工具 。同一个 CMake 工程可以在不同的平台上转换为与平台适应的工具,极大的方便了跨平台工程构建。

第一个 CMake

新建一个空目录,在其中新建一个文本文件,命名为 CMakeLists.txt,并输入以下内容:

好了,你的第一个 cmake 工程就已经建好了。接下来,新建一个文件夹 build, 并在该文件夹下运行命令:

你可能会得到以下输出:

再来看这个路径下,cmake 生成了一堆文件:

我们成功的使用 cmake 在 Windows 上构建了一个 vs 工程。 当然,如果你的操作系统是 MacOS, 或者 Linux, 结果后有所不同。

其实在 CMakeLists.txt 所以在路径下也能运行 cmake 命令。不过cmake没有提供专门的工具来清理生成的文件,为了方便管理,我们将其生成在 build 目录下。

这个 cmake 工程的作用仅仅是输出一了条消息,并没有什么意义。下面我们来让它更有意义一点:

阅读全文…