自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (4)
  • 收藏
  • 关注

原创 openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题

我们目前大部分使用的openssl库还是基于TLS1.2协议的1.0.2版本系列,如果要支持更高的TLS1.3协议,就必须使用openssl的1.1.1版本或3.0版本。升级openssl库有可能会导致SSL会话失败,我在升级 wincurl 时,意外的收获了一个函数。这个函数非常的不起眼,但具有的现实意义却很大。大部分情况下如果你不调用该函数,并不影响SSL会话和通信,但有时会被某些服务器拒绝。一旦被拒绝,查找具体的原因将变得非常痛苦。这个函数的意义好比HTTP协议中HOST字段,它和NGINX反向代理

2022-06-27 16:31:10 1412 3

原创 HtmlParse:一款超轻量级的HTML文件解析和爬取工具

HtmlParse 是一款基于windwos平台的HTML文档解析工具,可快速构建DOM树,从而轻松实现网页元素的爬取工作。DOM树就是一个HTML文档的节点树,每个节点由:标签(Tag)、属性(Attribute)、文本(Text)三个值来描述。 所谓的HTML文档解析,指的就是如何构建一颗DOM树,只有成功构建出DOM树,才有可能进行后续的数据爬取和分析工作。显然,构建DOM树是比较复杂的过程,因为不是每一个HTML文档都会严格按照规范来书写,因此解析过程需要具有一定容错能力。此外,解析效率也是一个

2022-06-14 11:45:33 698 2

原创 EmlBuilder:一款超轻量级的EML格式电子邮件阅读和编辑工具

EmlBuilder 是一款超轻量级的电子邮件阅读和编辑工具,针对EML格式的文件具有非常强大的解析和容错能力,可实现超文本邮件的编写,并具备内嵌图片的编辑功能。该工具内部使用EmlParse对电子邮件格式进行解析,并在阅读邮件的基础上增加了编辑功能。 该工具条特点如下:1、只有一个独立文件且不到500K;2、可阅读EML格式的电子邮件并具备回复、全部回复和转发邮件的编辑功能;3、具有超文本编辑功能以及内嵌图片功能;4、可将剪切板中的图像直接拷贝到编辑区,从而实现内嵌图片功能;5、

2022-05-26 13:04:36 3010

原创 如何用C/C++实现去除字符串头和尾指定的字符

编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格。通常我们会使用封装好的库函数或者类函数的Trim方法来实现,如果自己动手写一个TrimHead和TrimTail函数该如何实现呢? 本文针对字符串头(尾)部指定的字符的去除,分别给出两个实现方法。并分别比较一下改进后的性能如何?一、从头部开始去除指定字符首先从头遍历,直到遇见第一个非指定字符,此后将后续字符按顺序逐一前移。// 实现方式一void TrimHead(char* pszSrc,

2022-04-26 14:45:41 5255

原创 SMTP协议解读以及如何使用SMTP协议发送电子邮件

电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件。SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名。 相较于POP3而言,SMTP确实比较简单。这里的简单并不是指SMTP的命令比POP3少,而是指SMTP的命令是有序的,而POP3的命令是无序的,理解这一点很重要。也就是说SMTP的命令是要组合在一起才能完成一次邮件发送任务,单独调用每个命令的意义不大。POP3命令则不同,LIST、STAT、UIDL、TOP、RETR、

2022-04-20 14:14:37 16264

原创 EmlParse:一款超轻量级的批量解析EML格式电子邮件的工具

工具特点1、绿色纯天然,无任何依赖库,文件大小不到150K;2、可批量解析EML格式的电子邮件;3、可提取EML文件中的正文和附件到指定目录;4、可生成HTML格式的邮件列表清单,方便用户进行离线阅读;5、可生成JSON格式的邮件列表清单,方便用户进行二次开发;6、基于命令行参数的执行程序,可方便集成到第三方程序中使用;7、无需安装任何客户端软件即可阅读邮件;下载地址(EmlParse.zip)使用方法EmlParse EML_PATHFILE [-folder] -o OUT_FOL

2022-04-19 10:15:34 4912 16

原创 POP3协议(电子邮件邮局协议)中UIDL和TOP命令在实际使用中的作用

POP3是电子邮件协议中用于接收邮件的协议,相较于发送邮件的SMTP协议,POP3的命令要多一些。主要的命令有LIST、STAT、RETR、DELE、UIDL、TOP、QUIT,以及用于登录邮箱的USER和PASS命令。 介绍POP3命令的文章有很多,这里重点介绍UIDL和TOP在实际使用中的现实意义。 使用这些命令非常简单,可以用telnet命令进行模拟交互。下面以pop.yeah.net邮箱服务器为例,在命令行模式下输入:telnet pop.yeah.net 110

2022-04-11 13:51:53 1704

原创 POP3:基于命令行的电子邮件(EMail)在线查看和批量下载工具

使用该工具可以在不安装outlook和foxmail等邮件客户端的情况下快速下载指定邮箱的邮件,并将下载的邮件以eml格式进行保存。附: 查看eml格式的邮件可使用 EmlReader 工具,该工具不到300K,绿色免安装。【工具特点】1、基于命令行参数,只有一个可执行文件;2、内部集成SSL功能,提供安全可靠的邮箱访问;3、可将邮箱中的邮件以eml的格式下载到指定目录;4、在线支持POP3协议的STAT、LIST、DELE、RETR、TOP命令; 下载地址 http://soft

2022-04-02 13:47:49 1372

原创 如何解析EML(邮件)格式的文件以及一款小巧的EML邮件阅读工具

在理解EML格式的时候,先回顾一下历史,这样有助于理解邮件的格式,比如邮件传输时为何会有多种编码方式。此外,理解EML格式也有助于理解HTTP协议。历史溯源由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP、FTP、POP3、SMTP、TELNET等。 早期操作系统比如Unix或DOS没有图形界面,用户与电脑之间只能通过控制台进行交互,也就是通过键盘将命令(或请求)输入到电脑,当用户回车换行(\r\n)时,表示命令输入

2022-03-25 15:35:46 7963

原创 代码如何不成为屎山?

1、要敢于重构代码在一个开发团队中,很多人即使发现问题,但考虑到这坨屎不是自己亲自拉的,因此放弃了重构的打算;或者担心修改后引入其它问题, 反而会带来更多的风险,尤其是对已经发布的版本(或历史遗留版本)会更加谨慎,万一屎中有雷呢,万一是连环雷呢?炸一脸该怎么收场? 就算炸不到自己,万一炸到无辜的同事以及花花草草该怎么办?因此多一事不如少一事,少一事就等于没有事,管他以后谁维护呢!对于项目负责人来说,要担负的压力更大,在成本、质量、进度三者之间,进度往往是项目负责人的第一选择,也就是要满足起码的交付需求

2022-03-24 09:41:50 589

原创 一只会铲史的猫:我开发的软件一览

一、服务器类软件1.1、 HttpServer一款Windows平台下基于IOCP模型的高并发轻量级web服务器。技术特点如下:1、完全采用IOCP模型,实现真正的异步IO,高并发、高可靠;2、支持4G以上文件下载;3、支持断点续传;4、轻量级,体积小,服务器文件仅200多K,无任何依赖库;5、支持CGI网关,通过CGI.xml可动态配置各种网关接口,实现动态交互;6、内置上传文件接口;介绍文章:《HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服

2022-03-08 16:57:23 3180 1

原创 wincurl:一款基于HTTP协议的轻量级web资源抓取和上传工具

编写web程序经常要进行接口调测,通常我们会使用curl或者postman等工具,通过这些工具可以方便的发送GET或POST请求来验证接口的正确与否。对于复杂的接口业务,我们可以通过这些工具构造post data、query string、以及request header来完成这些接口的验证,从而大大提升我们的工作效率。有时我们也需要抓取和分析web服务器返回的原始数据,比如按照chunked(Transfer-Encoding)方式分块传输的数据,或者Content-Encoding为gzip的数据

2022-03-04 15:39:51 3090

原创 HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器

2021年4月写过一个轻量级的web服务器HttpServer,见文章: 《HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器》,但一直没有时间添加Openssl功能,也就是将HTTP拓展为HTTPS,从而提供安全访问功能。没时间只是一方面,关键是集成openssl的难度也很大。Windows的IOCP是一个高并发的异步IO模型,Openssl对异步IO支持的实现方式网上介绍的非常少,尤其是对IOCP模型。如果你的程序采用的是阻塞IO模型,使用openssl则非常简

2022-01-13 11:19:14 1875 1

原创 IM服务器:一个使用imserver服务器进行聊天的web端案例

该案例中包含一个基于web网页的前端程序,该案例会使用websocket与IM服务器(imserver)进行通信。一、环境准备1、下载 “imserver网页调用案例”,并解压到指定目录。2、进入“web/js”目录中,使用文本编辑器打开“main.js”文件。修改websocket的连接地址,该地址是IM服务器的地址。如下图:注意:IP地址不要填写127.0.0.1,填写ipcoinfg中配置的ip地址。二、运行服务1、启动web服务器双击解压目录中的 HttpServer.exe 程

2021-12-27 17:21:00 2999

原创 IM服务器:编写一个健壮的服务器程序需要考虑哪些问题

如果是编写一个服务器demo,比较简单,只要会socket编程就能实现一个简单C/S程序,但如果是实现一个健壮可靠的服务器则需要考虑很多问题。下面我们看看需要考虑哪些问题。一、维持心跳为何要维持心跳,TCP难道不是一个安全可靠的连接么?正常情况下,C端和S端无论是谁掉线,对方都能感知到。从而进行后续处理,比如释放维持的资源并通知业务层进行相应的业务处理。如果TCP通道非常繁忙,C端和S端都能通过正常的业务通信感知到对方的存在与否。但如果TCP通道长时间无数据往来,这种感知就无法主动获取到,这时就需要通

2021-12-24 16:09:36 1694

原创 我的邮箱客户端程序Popmail

05年的时候写了一个邮箱客户端程序。当时主要目的是研究POP3和SMTP协议,同时锻炼自己的网络编程能力。当然了,如果自己写的邮箱客户端能够满足自身的日常工作需要,而不是频繁的登录不同的网页邮箱,那就再好不过了。时隔16年,给popmail增加了SSL(TLS 1.2)会话,感觉安全了一点,邮件再也不用裸奔了,看到16年前的代码,非常感慨,随便写写,特此纪念。POP3和SMTP这两个协议本身都很简单,但实现起来还是有很大难度,尤其是你希望把它写的健壮、易用或者产品化的时候。比如HTTP协议也很简单,写个

2021-12-22 11:43:46 522

原创 IM服务器:开发一个高并发的IM服务器难在哪

IM服务器要实现的最基本功能就是消息的转发。——好像是一句废话!这就意味着IM服务器要为每个登录用户创建一个与该用户信息相关的内存上下文,为方便描述我们在这里称之为:user_context。user_context中一般包含这些基本信息:用户id、昵称、peer端的ip和端口,以及最重要的用于通信的socket。用户连接上线时,需要malloc一个user_context块,用于存储上述信息,用户断开连接时,需要free这个user_context块。IM服务器要随时维护这张user_context

2021-11-02 15:54:41 758

原创 IM服务器:我的千万级即时通信服务器集群

一、服务器特点01、傻瓜式部署,一键式启动;02、单机支持10万以上在线用户聊天(8G内存,如果内存足够大,并发量可超过10万);03、支持服务器集群,集群间高内聚、低耦合,可动态横向扩展IM服务器,最大支持200台IM服务器的集群;04、高并发、高稳定性;05、支持群组聊天;06、IM业务完全独立:只需uid(用户id)和gid(群组id),可方便的将IM业务集成到上层业务中;07、内置HTTP访问接口,用于查询用户状态(上线/离线);07、基于websocket协议,轻松实现网页端开发;

2021-11-01 17:00:21 1187

原创 最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本

编写服务器程序时,需要频繁的申请和释放内存,长时间运行会产生大量的内存碎片,这就导致即使当前系统中的闲置内存还足够多,但也无法申请到大的连续可用的内存块,因为此时的物理内存已经千疮百孔像个马蜂窝。此外,在高并发的情况下频繁的malloc/free也是一笔额外的cpu负担。如何解决内存碎片呢?在这里给大家安利一个举手之劳的好办法——重启应用。如果是客户端程序,可以通过退出重启的方式解决内存碎片的问题;不过对于服务器应用而言这样操作的风险比较大,但如果觉得自己命硬也不妨尝试一下。不好意思上面写错了,重新

2021-09-15 14:48:01 438

原创 你了解红黑树么?告诉你一个不一样的红黑树,说点有意思的吧!

先看如下两个问题:问题1、红黑树的键值可以重复么?问题2、红黑树必须有键值么?关于红黑树的介绍网上非常多,红黑树的应用也非常广泛。问一下度娘,她会告诉你各种各样的实现方法,C和C++版本都有,linux内核使用的版本也有。代码都大同小异,就是插入或删除时如何修正,如何搞平衡。很多文章图文并茂、写实而生动,当你在脑海里试图左旋一把,右旋一把搞平衡时,基本也到了精神崩溃的边缘。如何维护祖孙三代父、祖父、叔叔以及兄弟间的平衡,如何搞好家庭关系,是个头疼的问题。如果把红黑树比作一个族谱的话,可能开始你是高祖

2021-09-02 13:46:45 1041 6

原创 为何要打印日志?C++在高并发下如何写日志文件(附源码)?

为何要打印日志?让程序裸奔不是一件很快乐的事么?有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现。当你在测试人员面前赌咒发誓,亲自路演把程序跑一遍的时候,这些bug就会神奇的消失;一旦离开你的骚操作重新回到测试人员手中,这些bug又会突然的出现。这就是开发人员和测试人员互相对天发誓自证清白的尬聊场面。因为这些幽灵Bug破坏了团队的氛围,伤害了开发和测试人员的感情,从而导致了产品质量下降。 因此非常有必要找到这些bug发生的原因。试图找到这些具备量子特

2021-08-24 13:42:25 291 1

原创 如何用C++封装一个简单的数据流操作类(附源码),从而用于网络上的数据传输和解析?

历史溯源由于历史原因,我们目前看到的大部分的网络协议都是基于ASCII码这种纯文本方式,也就是基于字符串的命令行方式,比如HTTP、FTP、POP3、SMTP、Telnet等。早期操作系统UNIX(或DOS),用户操作界面就是控制台,控制台的输入输出方式就决定了用户只能通过敲击键盘的方式将协议命令输入到网络,这也就导致了回车换行"\r\n"会作为一次命令结束的标识。比如HTTP协议,与主机建立连接后,输入"GET / HTTP/1.1\r\n"即可获取网站的主页。比如email协议,早期的电子邮件协议

2021-08-03 11:01:57 497

原创 如何用C++自己实现mysql数据库的连接池?

为什么是mysql?现在几乎所有的后台应用都要用到数据库,什么关系型的、非关系型的;正当关系的,不正当关系的;主流的和非主流的, 大到Oracle,小到sqlite,以及包括现在逐渐流行的基于物联网的时序数据库,比如涛思的**TDengine**,咱们中国人自己的开源时序数据库,性能杠杠滴。凡此总总,即使没用过,也听说过,但大部分人或企业用的最多的就是白嫖型数据库:mysql。该数据库的特点就是无论是个人还是企业都能玩的起。像Oracle这种名媛型数据库基本就属于银行特供,银行需要花钱买平安,心里踏实

2021-07-30 11:39:23 228

原创 【超值分享】为何写服务器程序需要自己管理内存,从改造std::string字符串操作说起。。。

比如无处不在的HTTP协议,基于请求—应答的超文本协议,一问一答非常简单,请求头和响应头都是非二进制的字符串。当服务端收到客户端的GET或POST请求时,服务器程序要先构造一个响应头并拼接响应体,如下: // 构造响应头 string strHttpResponse; strHttpResponse += "HTTP/1.1 200 OK\r\n"; strHttpResponse += "Server: HttpServer \r\n"; strHttpResponse += "Content

2021-07-27 09:30:20 257 1

原创 如何定义一个自带数据区的结构体:三种数据结构体的比较

先看如下三个结构体的定义这三个结构体的前三个成员都相同,前两个成员只是为了充个数,从而让我们定义的struct看上去真的像个结构体,一个是char类型,一个是int类型。最后一个也是int类型,iDataLen用于记录结构体自带数据的长度,pData指向的就是我们“认为”的数据区。// 结构体1typedef struct data_node1{ char cDummy; int iDummy; int iDataLen; char* pData;}DATA_NODE1;//

2021-07-22 15:16:00 295 1

原创 如何为HttpServer服务器配置PHP FastCGI,从而让HttpServer具备动态交互能力

一、 软件准备1、下载HttpServer :HttpServer.zipHttpServer是一款windows平台下基于IOCP模型的轻量级、高并发、高性能web服务器(参见文章)。2、下载Windows版本PHP以下是绿色版本无需安装,解压即可,建议用迅雷下载速度更快。版本1:php-5.2.16-nts-Win32-VC6-x86.zip 版本2:php-7.0.15-nts-Win32-VC14-x86.zip二、 配置PHP FastCGI1、 解压PHP到指定目录,如 D:/

2021-07-16 13:24:49 312 1

原创 超值分享:ASN.1格式解析源码(未使用openssl),有助于分析证书、私钥等文件

源码下载地址一款简单的ASN.1格式解析工具,可将ASN.1格式输出,是你分析证书、私钥等文件的必备良器,比如查看公钥大数、私钥大数、加密算法、HASH、MAC算法等。ASN.h(.cpp)包含了ASN.1格式的解析类,ASNFileParse.cpp中提供了常用的pem、der等文件的解析。本源码未使用Openssl库。我在 基于SSL(TLS)的HTTPS网页下载——如何编写健壮的可靠的网页下载 中也是使用该类分析公钥和私钥。开发环境:Windows+VS2010ASN格式数据分两大类,基本数

2021-07-06 15:44:56 1144

原创 一款torrent文件格式分析工具(绿色纯天然)

点击下载一款torrent文件格式分析工具,可以查看torrent文件的内容,并对文件所在分片进行分析,以及获取指定分片在指定tracker服务器上的peers列表。1、主界面2、文件分析(显示文件所在分片的位置)3、获取指定分片所在的peers服务器列表...

2021-07-02 17:27:11 861

原创 基于SSL(TLS)的HTTPS网页下载——如何编写健壮的可靠的网页下载

**源码下载地址案例开发环境:VS2010本案例未使用openssl库,内部提供了sslite.dll库进行TLS会话,该库提供了ISSLSession接口用于建立SSL会话。HTTP协议很简单,写个简单的socket程序通过GET命令就能把网页给down下来。但接收大的网络资源就复杂多了。何时解析、如何解析完整的HTTP响应头,就是个头疼问题。因为你不能指望一次recv就能接收完所有响应数据,也不能指望服务器先发送HTTP响应头,然后再发送响应数据。只有把HTTP响应头彻底解析了,我们才能知道后续

2021-06-09 11:13:15 1290 2

原创 https ssl(tls)为什么不直接用公钥加密数据?

很多人都提到了非对称加密速度慢,但这只是一个原因,但不是主要原因,甚至是微不足道的原因。SSL协议到3.0后就已经到头了,取而代之的是TLS,相较于SSL的“安全套接字层”的命名,TLS的“传输层安全”这种定义更加严谨。毕竟传输安全的范畴要远大于套接字安全这种定义,这种定义偏技术层面,但安全不仅要解决技术层面的问题,也要解决人的问题以及由此带来的信任问题。因为加密只是安全的一部分,解决传输两端的信任,以及让整个算法摆脱人的因素,才是安全的核心。诈骗电话之所以能让很多人上当,实际上是一种信任欺诈,即使你和

2021-06-02 09:31:00 448

原创 V8引擎静态库及其调用方法

本V8引擎静态库分为x86版本和x64版本V8引擎静态库下载地址编译工具:VS2019v8开头的即为V8引擎静态库(附送其它开源静态库libuv.lib、zlib.lib等_)如何调用V8引擎1、下载v8静态库到本地2、配置开发环境将上述v8的include目录配置到“附加包含目录”配置项中根据你的开发环境配置不同版本的lib库(注意debug和release),如下:3、调用代码如下,需要创建一个控制台程序#include <iostream>#include

2021-05-24 16:25:17 2286 5

原创 什么是阻塞、非阻塞、同步和异步以及IO模型

首先先看如下几个问题,或者说我们经常会遇到的问题。阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起。假设你要做一顿便饭:烧土豆;烧茄子和米饭。CPU代表你,如下事件代表操作:A1、切土豆、A2、烧土豆B1、切茄子、B2、烧茄子C1、淘米、C2、煮饭;情况1:你做完A1再做B1再做C1,即:切完土豆、切茄子最后淘米;情况2:你干一会A1再干一会B1,再干一会C1,即:一会切土豆、一会切茄子、一会淘米,直到三者做完;情况

2021-05-24 11:53:08 175 1

原创 HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

HttpServer的特点1、完全采用IOCP模型,实现真正的异步IO,高并发、高可靠;2、支持4G以上文件下载;3、支持断点续传;4、轻量级,体积小,服务器文件仅200多K,无任何依赖库;5、支持CGI网关,通过CGI.xml可动态配置各种网关接口,实现动态交互;6、内置上传文件接口;点击此处下载​一、命令行参数介绍启动服务器: HttpServer.exe -W d:\web -H index.html -P 80 -M 10000-W : web网站的发布路径,如:d:\web,

2021-05-24 11:41:43 4044 11

HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

1、采用IOCP模型,实现真正的异步IO,高并发、高可靠; 2、支持4G以上文件下载; 3、支持断点续传; 4、体积小,占用资源少; 5、支持CGI网关,通过CGI.xml可动态配置各种网关接口; 6、内置上传文件接口; 博文:https://blog.csdn.net/lgsoftlee/article/details/117220517 详情:https://zhuanlan.zhihu.com/p/373532354

2021-05-19

ASN.1格式解析源码

一个简单的ASN.1格式解析工具,可将ASN.1格式输出。ASN.h(.cpp)包含了ASN.1格式的解析类,ASNFileParse.cpp中提供了常用的pem文件、der文件的解析。本源码未使用Openssl库。 开发环境:Windows+VS2010

2021-04-08

基于SSL(TLS)的HTTPS网页下载

1、本例中提供了sslite.dll库,该库提供了客户端的ssl层会话接口,开发者可方便的使用该库进行客户端的SSL(TLS)通信开发。 2、本例中使用sslite库进行HTTPS通信的开发,其中使用了llhttp进行HTTP层的数据解析,在C盘下会将下载的网页的原始文件写入TestSSLHttp.html中,网页的Body文件写入TestSSLHttp_body.html中。 3、SSLWrap.h(.cpp)中提供了SSL接口的访问。 4、开发环境: Windows+VS 2010

2021-04-06

Redis(Win32).rar

win32 平台下的redis安装程序和源码,来自:https://github.com/MicrosoftArchive/redis/tags。 源码:redis-win-3.2.100.zip 安装:Redis-x64-3.2.100.msi

2019-11-27

空空如也

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

TA关注的人

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