自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

左雪菲的专栏

微信公众号:高性能服务器开发,分享超级编程技术干货。

  • 博客(322)
  • 资源 (20)
  • 收藏
  • 关注

原创 我的新书《C++服务器开发精髓》终于出版啦

一、千呼万唤始出来亲爱的各位读者,我的新书《C++ 服务器开发精髓》终于终于终于与大家见面了,图书如下:图书的封面设计很精美,当然内容一定不负众望。因出版社老师要求提供一张照片放到封面上,今年的6 月 1日儿童节去拍了一张,照片拍出来放在下面大家自己看吧。人到中年,生活不易,没有少年时代那种懵懂与青涩,多了一份厚实与坚定了。一些想做的事情却一步步把它做成了,成为现实。昔日戏言身后事,明朝都到眼前来。所以,梦想还是要有的,还是要坚持的,即使这世界有那么多不完善,生活有那么多不如意,因为万一..

2021-06-25 01:32:34 3905

原创 详解银狐远控源码中那些C++编码问题

查阅了一下 MSDN,发现GlobalAlloc函数分配内存时可以指定标志位,当标志位为GMEM_MOVEABLE时,分配的内存为可移动内存,CreateStreamOnHGlobal函数的第二个参数如果指定为 TRUE 时,在调用IStream::Release 时会自动释放CreateStreamOnHGlobal创建的 OLE 对象的内存。由于工程设置使用了Unicode字符集合,一个字符占两个字节,而图中传递的是字节数目,当存放路径较长时,容易造成内存越界,引起崩溃。

2026-01-06 14:47:07 982

原创 银狐远控一键编译调试与开发教程

dll转shellcode数据文件的逻辑对应主控中dll_to_shellcode函数,dll_to_shellcode在生成shellcode时有个param参数决定这个shellcode将来如何执行,param为0时,生成的shellcode入口点在插件dll的DllMain函数,param为1时,生成的shellcode入口点在插件dll的导出函数run中。shellcode对于一般人来说,太难读且难以调试,我也是这么认为的,所以我在被控段增加了如下逻辑方便调试和修改,以上线模块为例,修改。

2025-12-16 18:09:00 859

原创 银狐远控软件去后门方法

G729a,这是一个很早之前的开源库,用于银狐的语音(麦克风和扬声器插件)功能,市场上流行的银狐大多数版本的源码都不含这个库的源码,现在也很难在网上找到这个库的源码了。HPSocket,这是银狐使用的网络通信库,所不同的是,银狐主控端直接依赖这个库的源码编译出来的lib,而被控为了减少被控和shellcode提交,将hpsocket库部分源代码剥离出来直接放到被控插件工程中。Winlicense,这是银狐主控使用的对程序本身使用的加密库,用于防破解功能,这是一个商业库。XTP库,这是银狐主控使用的界面库。

2025-12-10 14:49:06 723

原创 编译银狐代码遇到unresolved external symbol __imp__fopen报错的解决办法

上述错误中依赖的库reyuv_32.lib使用了/MD的方式链接CRT库,但是娱乐屏幕.dll使用了/MT的方式,这样娱乐屏幕.dll链接reyuv_32.lib时期望它自带CRT库,但是它使用的共享方式链接CRT库,因此报编译错误了。可能是你的依赖库链接CRT的方式使用了/MDD或者/MD,但是你的主工程使用了/MTD或者/MT,一句话两个工程链接CRT的方式不一样,将两个工程链接方式改成一样即可。经常遇到这种fgets、fopen、strtok等基础的函数无法链接的问题。

2025-12-09 17:15:41 179

原创 银狐远程屏幕内存优化方法探究

先介绍一下问题背景。我的屏幕分辨率是1920*1080,一般一帧完整的屏幕数据,最大的达到10M,即使使用了差异算法之后,再加上压缩,有时候一帧完整的数据也达到了一百多kb,高清显示屏有时候最大到20M,所以数据大小在0~20M左右。同时,我也测试了目前主流几种压缩算法,如zlib、lz4、zstd等,综合下来发现lz4在速度和压缩比率上效果相对较好,所以默认就选择了该压缩算法。另外,对于远程屏幕这种应用来说,由于每秒都有持续不断的屏幕数据从网络线程收到,然后处理好后发给用户线程。

2025-09-17 14:25:28 1064

原创 微软官方给的完成端口(IOCP)官方示例

其他网络模型我们可以通过send或者recv函数的返回值判断网络连接是否正常,到了完成端口模型中,除了接受连接事件以外,也就是说如果。

2025-09-11 15:34:43 194

原创 银狐远控代码中差异屏幕bug修复

银狐远程控制软件一共提供了4种远程屏幕模式,分别是差异屏幕、高速屏幕、娱乐屏幕和后台屏幕,如下图所示:添加图片注释,不超过 140 字(可选)其中前三种屏幕都是获取被控端桌面的内容展示出来,只不过屏幕传输算法不一样,例如差异屏幕是传输远程屏幕图像中发生变化的部分,高速屏幕把屏幕数据压缩成有损JPEG,压缩比例可以调整,压缩后的数据相比较原始数据小很多,所以传输起来,速度非常快。

2025-09-01 13:24:34 979

原创 解决Visual Studio启用Address Sanitizer后报错误

【代码】解决Visual Studio启用Address Sanitizer后报错误。

2025-08-21 10:21:20 293

原创 x64汇编与 shellcode 入门教程 01

这将生成一个.obj文件。你应该获取你的shellcode输出以及汇编指令。这是我的输出示例。done现在,这一切的最后一步。让我们将x64 shellcode添加到一个自定义的C++程序中并执行它!// 注意标志位PAGE_EXECUTE_READWRITE,给这段空间的数据设置为具有读写和可执行权限return -1;return 0;信不信由你,我们才刚刚热身!我希望你和我一样兴奋,因为下一部分将介绍如何去除空字节(NULL bytes。

2025-08-04 11:20:20 1118

原创 用C++20开发一套交易系统的撮合引擎

我们还定义了一些基本的普通旧数据(POD,Plain Old Data)风格的结构体,用于封装限价订单簿中单个订单、订单服务器发送的单个订单请求、发回给订单服务器的订单响应,以及单个市场数据更新的信息。在本节中,我们将构建撮合引擎类的各个部分。此外,我们还将构建位于电子交易交易所内的订单服务器组件,该组件管理与不同市场参与者订单网关的通信,转发与撮合引擎之间的请求和响应。然后,我们构建了撮合引擎组件,它是一个独立的执行线程,从订单服务器接收更新,并将响应和市场数据更新发布回订单服务器和市场数据发布者。

2025-08-04 11:07:37 1001

原创 银狐远控源码问题排查与修复

银狐是一款强大的远程控制软件,除了有远控常用的功能,还有很多特色功能。

2025-06-26 14:39:36 1891 1

原创 交易系统的关键组件开发

通过本文的学习,我们全面了解了交易系统的构建过程,涵盖了设计和启动交易所需的所有必要组件。构建一个成熟的交易系统并非一朝一夕之功,需要经过长时间的经验积累。而且由于不同资产类别之间存在较大差异,在实际开发过程中,通常会专注于某一个或几个特定领域,而不是试图涵盖所有资产类别。我们介绍了交易系统最基本的功能集合,但要让交易系统真正稳定、高效地运行,还需要进一步学习如何将各个组件有机地连接起来,以及如何根据实际交易需求进行优化。使用 C++20 从零构建一个完整的低延迟交易系统交易系统开发岗位求职与面试指南。

2025-06-19 19:40:42 1206

原创 心中的Linux内核 —— 在阅读内核代码之前先理解内核 专栏

这并非一部教你编写内核代码的指南,而是一场探寻Linux内核设计思维的思想之旅。在系统编程的世界里,人们常常迷失于符号定义、头文件结构与实现细节的丛林中。然而剥离代码表象,内核实则是一个井然有序的响应式系统——它受上下文环境所规约,以分离原则为基石,从内存管理到任务调度的每一处设计,都浸透着精准的设计意图。本系列内容专为那些渴望在内核源码之外构建内核运行心智模型的探索者而作。无论你是初次叩响Linux内核内部机制的大门,还是带着全新思考重返这片领域,我们聚焦的核心始终是行为逻辑,而非语法细节。

2025-06-17 19:46:14 748

原创 C/C++编程实战训练营

这是我根据自己学习C++网络编程以及工作十年在项目中设计网络通信框架的经验总结,为了照顾C/C++新手先解决C++工具问题,再逐步减少网络编程的基础API和网络模型,最后再到综合性整合性练习,每介绍一些基础知识,都会拿一些实际的项目去佐证(实战)。如果在面试时,感觉面试官的问题都回答上来了,或者感觉自己简历中项目挺好的,面试完回去等通知后,就再也没有“通知”了,可以看看这里:《通过了面试很开心,马上要和HR谈薪资了,但是报太高了失去了offer,报太低了,自己又觉得吃亏,可以看这里:《

2025-06-03 21:03:02 838

原创 C++17详解

C++11 是 C++ 语言的一次重大更新。它带来了许多现代特性,如 lambda 表达式、常量表达式(constexpr)、可变参数模板、多线程、基于范围的for循环、智能指针等强大元素,标志着该语言取得了巨大进步。之后的 C++14 是一次较小的更新,它改进了先前标准中的一些内容,并增加了一些小特性。虽然C++17不像C++11那样变化巨大,但它比 C++14 的改动更大,带来了许多令人激动的新增内容和改进。本书将带你逐一了解这些变化!

2025-05-19 14:07:16 883

原创 Go项目实战:用Go从零写一个编排器(类Kubernetes)

通过这个项目,你不仅能学到大型Go项目如何组织安排的,同时也能学到容器相关的技术,更不用说各种设计理念和开发技巧了。本专栏带领着大家使用Go语言从零一步一步地开发一个类似于Kubernetes的编排器。

2025-05-19 13:55:03 346

原创 Go实战项目推荐:用Golang从零实现一个解释器

如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。其详细目录如下。

2025-05-19 13:50:50 586

原创 Go实战项目推荐:使用Go从零开发一个编译器

如果有一定 golang 语法基础,真的只要一点点 golang 语法基础,甚至连go routine、channel 等知识你都不需要会的,都可以阅读这本书。而最终实现的编译器功能麻雀虽小,五脏俱全。另外,本书文风非常幽默,我在翻译时,尽量保持这样的文风,当然,你也可能会看到一些中国人不懂的英语思维的笑点。如果你的golang水平仅仅入门,不知道大型golang项目如何组织,或者想学习犀利的golang程序如何开发,强烈推荐看一看。

2025-05-19 13:47:54 369

原创 Go实战项目推荐:使用Go从零开发一个数据库

访问地址:使用Go从零开发一个数据库

2025-05-19 13:45:00 301

原创 C++游戏编程入门 教程

如果你连C++基础语法都不熟悉,并且想学习C++,或者想学习游戏开发,那么本专栏特别适合你。在这个教程中,我们将使用C++开发4个流行的小游戏。

2025-05-19 12:23:52 865

原创 Windows 10系统编程 说明

这应该是继《Windows核心编程》之后、最近十年最好且唯一的关于Windows编程的书吧,其涉及的内容涵盖Windows7到Window10程序的方方面面,非常详尽、通俗易懂。很多人觉得利用Windows API进行Windows原生编程已经日薄西山了,Windows系统不常用了,这其实是程序员的幸存者偏差,无论是工作还是娱乐,对于普罗大众来说,Windows系统仍然是最最常使用的操作系统,就像现在一些人已经不愁吃不愁穿了,会忽视水稻的重要性了。学习Windows编程的好处如下:在如今的求职大环境下,Wi

2025-05-07 22:15:27 655

原创 远程控制软件 gh0st 源码分析

相信很多人应该或多或少地听说过 gh0st 的大名,正如上面所说,它是一款远程控制软件,其原始版本的代码和作者已经无从考证,笔者手里这一份也来源于网络,我修正一些 bug 并作了一些优化,仅供个人学习研究,不可用于商业用途和任何非法用途,否则后果自负。

2025-05-07 22:06:34 978

原创 C++23快速入门

利用唯一指针(Unique Pointers)、共享指针(Shared Pointers)和弱指针(Weak Pointers)示例程序:使用std::unique_lock避免竞态条件(Race Condition)用未来对象(Futures)、承诺对象(Promises)和任务(Tasks)协调线程。示例程序:集成std::string和std::string_view。深入探究std::string和std::string_view。std::string与std::string_view的对比。

2025-05-07 21:56:13 996

原创 涵盖C++17和20,C++语法面试题.pdf 限时领取

我学习和使用 C/C++ 开发十多年了,目前在某大厂做 C++ 架构方面的工作,在学习 C/C++ 的过程中,我踩了一个又一个坑,深知新手学习 C/C++ 的重要性和存在的困难,面试工作经验要求和与通过工作获取经验往往是一对先有鸡先有蛋的矛盾体——你没有工作经验就没法获得工作,你不工作就没法获得工作经验。许多工作年限不长的 C/C++ 小伙伴在面试时,被面试官的各类的 C++ 语言题问得抓耳挠腮、怅然若失。C++单纯从语法层面来讲,就挺复杂的,而许多新人望而却步。关键字mutable的作用是什么?

2025-04-17 14:04:22 289

原创 关于小方~

大家好,我是张小方。玩知乎很久,做个自我介绍吧。🐶 工作十余年,地大师兄,在字节搬过砖,目前在某外企做架构。- 足够硬核,内容老狠了!- 备注来意。

2025-04-09 21:32:35 995

原创 明基RD280U显示器|大厂程序员都在用的生产力工具

工欲善其事必先利其器。明基的这款显示器体验了2周后,总结下来就是:相比之前得普通显示器,切切实实的解决了互联网公司程序员日常工作中的一些痛点,带来了极大的舒适度、效率提升和健康保护,是一项划算的投资。

2024-09-04 12:15:32 1807

原创 Mac机器上使用VM虚拟机安装win11连不上网,怎么解决

M用户使用VM虚拟机安装win11连不上网,怎么解决_vmware fusion 没有网络-优快云博客VMware Fusion 配置网络适配器_vmware虚拟机苹果网络-优快云博客

2024-05-10 20:18:11 3009 1

原创 Linux最大文件句柄(文件描述符)限制和修改

Linux最大文件句柄(文件描述符)限制和修改_ulimt -n修改句柄-优快云博客

2024-03-27 10:36:47 432

原创 cmake 编译时提示: Could NOT find OpenSSL

参考:cmake 编译时提示: Could NOT find OpenSSL | 要懂得舍得博客

2024-03-09 22:20:18 1179

原创 Visual Studio中文注释乱码两种解决方案

在公司多人开发项目中经常遇到拉到最新代码,发现中文注释都是乱码,很是emjoy.....这是由于编码格式不匹配造成的,如果你的注释是 UTF-8 编码,而文件编码是 GBK 或者其他编码,那么就会出现乱码现象。

2023-12-11 21:00:36 6982

原创 13.纤程(Fiber)与协程(Coroutine)

13.1 纤程纤程(Fiber)是 Windows 操作系统提供的概念。什么是纤程呢?当我们需要异步执行一些任务时,常用的一种做法就是开启一个工作线程,在工作线程中执行我们的任务。但是这样存在两个问题:由于线程的调度是操作系统内核控制的,我们没法准确地确定操作系统何时会运行或挂起该线程; 对于一些轻量级的任务,创建一个新的线程去做,消耗比较大,我们不希望有这种消耗。那么有没有一种机制,既能起到新建线程执行任务,又没有新建线程消耗那么大呢?有,这就是纤程。在 Windows 中一个线程中可

2023-12-10 14:39:27 1994 1

原创 12.线程池与队列系统的设计

不过是一组线程而已,一般情况下,我们需要异步执行一些任务,这些任务的产生和执行是存在于我们程序的整个生命周期的,与其让操作系统频繁地为我们创建和销毁线程,我们通常需要创建一组在我们程序生命周期内不会退出的线程,为了不浪费系统资源,我们的基本要求是当有任务需要执行时,这些线程可以自动拿到任务去执行,没有任务时这些线程处于阻塞或者睡眠状态。当然,技术上除了要解决线程池的创建、往队列中投递任务、从队列中取任务处理,我们还需要做一些善后工作,如线程池的清理,即如何退出线程池中的工作线程和清理任务队列。

2023-12-10 14:37:02 1291

原创 11.C库的非线程安全函数

结构体指针类型,而我们外部并不需要释放这个指针指向的内存,因此我们断定这个函数内部一定使用了一个全局变量或函数内部的静态变量。这样的话,当再次调用这个函数时有可能前一次调用结果就被后一个结果覆盖了。是因为最初编写很多 CRT 函数时,还没有多线程技术,所以很多函数内部实现都使用了函数内部的静态变量和全局变量。随着多线程技术的出现,很多函数出现了对应的多线程安全版本,如。因此我们在实际开发中应避免在多线程程序中使用这类函数,这类函数还有如。这类 CRT 提供的具有上述行为的函数,我们称为。

2023-12-10 14:29:19 573

原创 10.线程局部存储

对于一个存在多个线程的进程来说,有时候我们需要有一份数据是每个线程都拥有一份的,也就是说每个线程自己操作自己的这份数据,这有点类似 C++ 类的实例属性,每个实例对象操作的都是自己的属性。我们把这样的数据称之为。上述程序一共创建 5 个线程,每个线程都会自己生成一个日志文件,每个线程将自己的日志写入自己的文件中,当线程执行结束时,会关闭打开的日志文件句柄。是一个线程局部变量,因此该进程中每一个线程都会拥有这样一个变量副本,由于是不同的副本,)数据,因为进程中的所有线程都可以使用返回的键,所以参数。

2023-12-10 14:24:05 1084

原创 09.多线程使用锁实践经验总结

前面也说过,这种逻辑非常容易因为疏忽忘记在某个地方加上解锁代码而造成死锁,所以一般建议使用 RAII 技术将加锁和解锁代码封装起来,也就是说,我们可以定义一个锁对象包装类,其成员变量含有一个锁对象,在该包装类的构造函数中对锁对象进行加锁,在析构函数中对锁对象进行解锁,这样在函数出口处,锁对象包装类由于出了作用域被析构进而对其锁对象进行解锁。所谓减小锁使用粒度指的是尽量减小锁作用的临界区代码范围,临界区的代码范围越小,多个线程排队进入临界区的时间就会越短。请求锁,以免出现“活锁”现象,这是对资源的一种浪费。

2023-12-10 14:21:34 945

原创 08.如何确保创建的线程一定运行起来?

不知道读者注意到没有,我在介绍上述说的确保线程一定运行起来的做法时使用了两个词——“古老”和“严谨”,“严谨”不用多介绍,之所以说“古老”是因为你现在在各种新型的项目中基本上再也看不到这种确保线程运行起来的做法了,许多年以前多线程编程开始流行起来的时候,那时由于软硬件的水平限制,加之很多开发人员对多线程编程技术的不熟悉,创建新线程时确保一个线程跑起来非常必要;基于以上思路,我们创建一组线程时,可以一个一个地创建,每成功运行一个新线程再创建下一个,确保线程组中的每一个线程都可以运行起来。

2023-12-10 14:20:10 583

原创 07.C++11/14/17线程同步对象

C++ 11 标准让很多开发者诟病的原因之一是,C++ 新标准借鉴 boost 库的 boost::mutex、boost::shared_mutex 而引入 std::mutex 和 std::shared_mutex,但是在 C++11 中只引入了 std::mutex,直到 C++ 17 才有 std::shared_mutex,这让只能使用仅支持 C++11 标准的编译器(例如 Visual Studio 2013,gcc/g++ 4.8)的开发者非常不方便。

2023-12-10 14:19:13 1063

原创 06.Windows线程资源同步对象

需要说明的是,临界区对象通过保护一段代码不被多个线程同时执行,进而来保证多个线程之间读写一个对象是安全的。也就是说,当其中一个线程离开临界区,即使此时有其他线程在这个临界区外面等待,由于线程调度的不确定性,此时正在等待的线程也不会有先进入临界区的优势,它和刚离开这个临界区的线程再次竞争进入临界区是机会均等的。当然,在实际开发中这种方式是靠不住的,线程调度是操作系统内核的策略,应用层上的应用不应该假设线程的调度策略是按预想的来执行,但是理解线程与临界区之间的原理有助于你编写出更高效的代码来。

2023-12-10 14:16:53 1130

原创 05.Linux线程同步对象

某个线程A在条件不满足的情况下,主动让出互斥体,让其他线程去折腾,线程在此处等待,等待条件的满足;线程A之所以可以安心等待,依赖的是其他线程的协作,它确信会有一个线程在发现条件满足以后,将向它发送信号,并且让出互斥体。因为某次操作系统唤醒pthread_cond_wait时tasks.empty()可能仍然为 true,言下之意就是操作系统可能会在一些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件 变量的线程也有可能会醒来的情形。的,因为多个线程会同时读写之。

2023-12-10 14:10:24 1093

安卓版TeamTalk客户端源码

安卓版TeamTalk客户端源码,开发环境: IDE使用Android-studio java 1.7 gradle 2.2.1

2017-05-25

Gh0st全套源码

Gh0st是一款优秀的远程控制软件,其可以实现对被控制端诸如文件管理、远程桌面、进程管理、视频监控等操作。

2018-02-15

myreactor项目C++11版本源代码

一个用C++写的echo服务器,运行在linux平台,使用epoll ET模式,支持多个客户端连接和收发消息,纯C11代码。包括C++11新的变量初始化方式、for循环、auto关键字、线程、互斥体、条件变量等C++11常用的技术。

2016-12-04

TeamTalk pc客户端源码

TeamTalk pc客户端源码,用VS2013直接打开即可编译调试。

2017-05-25

myreactorserver项目源码

myreactorserver项目源码,实现echo功能,使用epoll ET模式,运行在linux平台,支持多个客户端连接。

2016-12-04

TeamTalk源码和redis-3.2.8安装程序

蘑菇街开源的即时通讯软件TeamTalk

2017-05-05

即时通讯flamingo服务器端代码

这是即时通讯flamingo服务器端代码,目前即时通讯软件实现了如下功能: 注册 登录 查找好友、查找群 添加好友、添加群 好友列表、群列表、最近会话 单人聊天功能(包括发文字、表情、窗口抖动、离线文件) 群聊功能(包括发文字、表情) 修改密码 修改个人信息(自定义昵称、签名、个性头像等个人信息) 自动升级功能 包括聊天服务器和文件服务器,同时也是一款通用的C++11网络框架。

2017-04-06

封装了WinInet的HttpClient库

封装了WinInet的HttpClient库,提供多个http接口,强大稳定。

2017-05-19

Linux高性能服务器编程.pdf

Linux高性能服务器编程.pdf 高清带详细目录

2016-11-04

UNIX环境高级编程(中文第三版).pdf

UNIX环境高级编程(中文第三版).pdf 有目录 清晰度勉强可以看

2016-11-04

即时通讯flamingo客户端

目前即时通讯软件实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列,请自行发现): 注册 登录 查找好友、查找群 添加好友、添加群 好友列表、群列表、最近会话 单人聊天功能(包括发文字、表情、窗口抖动、离线文件) 群聊功能(包括发文字、表情) 修改密码 修改个人信息(自定义昵称、签名、个性头像等个人信息) 自动升级功能

2017-04-06

文章《用Android Studio进行NDK编程》配套资源

文章《用Android Studio进行NDK编程》配套资源,本来不想要积分的,可是现在优快云规则改成资源至少是两分 - -!

2018-04-17

JavaScript设计模式与开发实践.pdf

JavaScript设计模式与开发实践.pdf 高清 有目录

2016-11-04

编译系统透视:图解编译原理.pdf

编译系统透视:图解编译原理.pdf 高清 但是 没有目录

2016-11-04

蘑菇街TeamTalk源码

蘑菇街 TeamTalk 源码 IM 即时通讯

2017-05-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除