实现端口转发的几种方法
端口转发在有些时候还是比较有用的,它能够在数据传输的过程中增加一个“路由”,提供了某种程度的灵活。本文简单介绍了工作中遇到的一个可能使用端口转发能解决的例子,以及如何使用端口转发,包括介绍了在Windows上的内置的端口转发工具,以及一些开源的端口转发程序,最后再简单介绍了如何使用C#实现一个端口转发工具。 …
端口转发在有些时候还是比较有用的,它能够在数据传输的过程中增加一个“路由”,提供了某种程度的灵活。本文简单介绍了工作中遇到的一个可能使用端口转发能解决的例子,以及如何使用端口转发,包括介绍了在Windows上的内置的端口转发工具,以及一些开源的端口转发程序,最后再简单介绍了如何使用C#实现一个端口转发工具。 …
前段时间用C++写了个批量改文件名的小工具,发现在改英文文件名的时候正常,但是遇到中文文件名就会失败。调试过程中发现,中文文件名在程序里得到的是乱码。这个问题在VS Code中很明显,只要是在VS Code的控制台里输出中文字符,大概率乱码,所以在在使用VS Code练习C++的时候,很少使用中文字符。这个问题我也一直没有深究,最近看了字符编码的相关知识,这里总结记录一下。为了了解乱码,需要了解什么是字符编码,本文介绍了一些常用的编码比如ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32,在此过程中也介绍了大端小端的概念以及字节顺序标记BOM相关知识。 …
Visitor模式的一大缺点就是依赖问题,在定义Visitor接口的时候,就必须要知道所有的子类类型。在一些编译链接型语言如C++中,Visitor类和子类就会出现相互依赖的情况,当然,通过前向声明可以解决这个问题。另外一个问题就是在不同的子类中有很多“制式”代码。比如所有的子类必须实现基类中的Accept(Visitor&)方法,并且方法的实现都是一模一样的,都是调用该参数的Visitor方法并传入指向对象本身的引用。幸好在C++ 11中引入了可变参数模板,使用可变参数模板以及CRTP技术,可以极大简化Visitor模式中的一些实现方面的问题。在这一过程中顺便学习和了解Moden C++的一些强大的功能,这些功能是如此的特别以至于它跟C#有很大的不同。 …
本来是想接着上文继续来说明如何使用C++模板来简化Visitor设计模式的,但这里涉及到了C++ 11中引入的可变参数模板,这个特性很有用,所以值得专门写一篇文章来介绍一下C++中的可变参数模板。可变参数模版比较特殊,跟其它语言比如C#里面的params相比,似乎更加灵活和强大。 当然我没有能力对某个特性做全面的解读,可变参数模板有很多用处,这里列举了侯捷老师在《 C++新标准:C++11&14》课程里对可变参数模版的解读里面举的几个例子,这几个例子比较经典,完美的解释了可变参数模版的用法。这篇文章算是一个简单的笔记,C++里面有些特性需要反复的学习和复习才能掌握。 …
在23种经典设计模式中,Visitor模式可能是比较难理解的几个模式之一,之前在C#设计模式之访问模式这篇文章中渐进式的介绍了Visitor设计模式。恰巧最近看的《C++语言设计与演化,简称D&E》这本书中提到了一个单分派和双分派的概念,这里从前文介绍的C++中的虚函数表以及动态分发即单分发的基础上,介绍双分发以及基于双分发的Visitor设计模式,试着从另外一个角度来看访问者这一经典的设计模式,最后对比了通过工厂方法和访问者模式的异同。 …
C++的有些知识点可能不在《C++ Primer,5th》或者《The C++Programming Language,4th》里,作为一个看这两本书的初学者,这有些难办。C++的有些知识藏在犄角旮旯里,但时不时就能碰到,今天就谈谈遇到的成员指针。跟C#或者Java中成员变量或者函数必须定义在类里面不同,C++中的成员变量或者函数既可以写在类的外面,也可以写在类的里面,这或许是为了兼容C的缘故。针对指向的是否是成员变量或成员函数,C++中必须要进行区分,这或许就是成员指针的由来,本文简单介绍C++成员指针中的成员变量指针和成员函数指针。 …
在C++中,如果一个类有虚函数,那么该类的对象在实例化后,会多一个指向虚函数表(virtual table, vtbl)的指针(vitrual table pointer, vptr)。虚函数表及虚函数调用是C++实现多态或者说动态分发(dynamic dispatch)的基础。本文首先介绍一下C++中的对象的虚函数指针以及类的虚函数表的结构,然后介绍了通过使用虚函数表实现动态分发的原理,最后讨论了虚函数调用的性能。 …
随着Windows开始拥抱Linux,在Windows 10以及之后的操作系统里内置了Windows Subsystem For Linux(WSL)模块,可以很方便的在Windows上使用和体验Linux,并且资源开销相对于虚拟机来说要小的多,相当于在Windows上安装了一个名为Ubuntu的应用,并且可以在Windows上直接访问和查看Linux下面的文件系统。我初步体验下来还是非常友好和方便的,Linux操作起来在有些情况下就是比Windows下面更加直接和高效。本文记录一下在Windows 11上启用WSL,安装Ubuntu,以及Ubuntu里面搭建C++的基本开发环境的步骤,算是一个笔记,后面在熟悉Linux操作系统以及学习C++的时候,直接就可以使用WSL里面的Ubunut环境。 …
有时候需要让一个线程终止运行,.NET Framework的Thread类中提供了Abort方法,调用某个线程实例对象的Abort方法,可以让该线程类抛出一个ThreadAbortException从而终止该线程的运行。但使用Abort方法终止一个线程对象显得比较暴力,而且可能会有很多潜在的问题,尤其是一个线程调用另外一个线程的Thread.Abort方法终止时。好消息是从.NET 5.0开始Thread.Abort方法就已经被弃用,如果调用就会抛出“PlatformNotSupportedException”,本文主要介绍简单粗暴杀手线程的可能危害,以及如何优雅地退出线程的方法。 …
本文也是候捷《C++内存管理机制》的笔记,介绍了C++原始内存分配的基本方法,优缺点,以及介绍了一个简单的内存池,虽然在Modern C++中已经不建议直接管理内存分配后的指针,而是采用智能指针的方式。但是这些只是对原始内存分配的一些包装或处理,所以这里记录一下。 基本方式 《Effective C++》这本书开篇就指出,C++由几大部分组成: C语言部分。C++是以C为基础,C++经过编译器处理后就是C语言。在C++中仍然保留了很多C语言的用法,比如区块(blocks)、语句(statement),数组(arrays)、指针(pointer)等等。所以C语言中的一些内存分配方法,在C++中仍然能够使用。 面向对象,就是C with Class,包括类、封装、继承、多态等等。 模版,Template C++是C++泛型编程的一部分。这一点跟C#中的泛型编程个人感觉区别巨大。但C++中的模版 …