自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

进击的小学生

To be or not to be, this is a question.

  • 博客(60)
  • 资源 (10)
  • 收藏
  • 关注

原创 135-大写转换服务器

相信你已经基本掌握了最最最简单的基于 TCP 连接的服务器编程技术了。本文算打算完成一个小型服务器,该服务器接受客户端发送过来的数据,然后将数据中的字母转换成大写后再发送给客户端。1. read 和 write(1) read在这里,我们需要将 read 函数再次出来讲讲。以前我们遇到的 read 的返回值一般不是大于 0 就是小于 0. 大于 0 的返回值表示 read 到的数据字节数,小于 0

2017-03-31 19:14:33 3066

原创 134-开始通信

这恐怕是大家最关心的问题了。在上一文中,接受连接也完成了三次握手的过程,但是我们却不知道如何让两个进程互相发送数据。实际上我们知道,对于服务器进程来说,三次握手建立完成后的连接,仍然在未决连接队列中,要想让进程通信,服务器进程就需要从未决连接队列中取出连接。此过程由函数 accept 函数完成。1. accept 函数(1) 函数原型int accept(int sockfd, struct soc

2017-03-31 15:38:57 1688 2

原创 133-接受连接

1. 被动 socket 与 主动 socket前面几讲以来,一直未提到这个概念。实际上,使用 socket 函数创建的套接字(插座)默认情况下就是主动 socket。主动 socket,是指未来你将要用此 socket 主动发起连接,即你将要把它传递给 connect 函数。被动 socket,也被称为监听 socket,它不能用作 connect 函数的参数。这个套接字,只能用来接受连接请求。

2017-03-31 14:52:12 1731 3

原创 132-发起连接请求

如果有一个进程将插座(socket)与套接字地址进行了绑定,同时将套接字地址进行了公开,就意味着,其它网络中的计算机可以去连接它。如果想连接到这个公开了套接字地址的进程,可以使用函数 connect.1. connect(1) 函数原型int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);前面说过,对于主动发起

2017-03-31 13:23:35 1629 2

原创 131-安装“插座”

实际上,这一节的标题应该叫《创建套接字》,如果搞个这样的标题,未免也太学术了,不直观,还容易被群殴。在上一讲中,我们只讲了“插座”它有一个地址叫“插座地址”,即套接字地址,可是我们一直没说清楚在进程中这个插座是怎么来的。插座并不是一开始就有的,而是需要创建的。1. 安装 socket请自动的把 socket 翻译成“插座”。使用函数 socket 就可以办到,这个函数非常简单:#include <s

2017-03-30 18:50:20 1882 3

原创 130-IP 地址和端口号

1. 引言网络通信的本质仍然是进程间通信。几个月前,我们在学习进程间通信的时候(共享内存、管道、以及用于同步的信号量),并没有提到过网络 IPC,那时候是因为基础不太够。另一方面,之前讲的进程间通信,所有的进程都位于同一个操作系统上。然而网络通信跨越了这条“鸿沟”,穿越了世俗的界限,将进程间通信扩展到了不同的计算机上。在同一个操作系统上,不同进程之间可以使用进程的 pid 号进行唯一标识。可是在不同

2017-03-30 17:39:49 3096 2

原创 129-IPv4 地址

网络真的是一个很复杂很复杂的东西。网络编程更是相当复杂,尽管它很复杂,也不过是由人发明的,基础就在那,就看你学不学。我们使用的网络目前都是 IPv4 (IP version 4) 版本的,所以使用到的 IP 地址也是第 4 版本的,IPv6 版本的不是不讲,是我也还没用过!!!所以,这个博客涉及到的所有的网络编程,都是基于 IPv4 的东东。在学习 IPv4 前,掌握 ip 地址相关的知识那是必须的

2017-03-30 15:26:38 2100 2

原创 128-字节序

是不是感觉很突兀,前面的博文还有讲异步 IO 来着。从现在开始,我们将步入网络编程的轨道了。但是又怕初学者难以适应(我也是初学者^_^),所以不能大张旗鼓的喊着,网络编程开始啦……另一方面,apue 这本书讲的网络编程只是一个入门,真正想学习网络编程基础的话,还需要去看 《Unix 网络编程》这本书,简称 unp。当然这本书的学习笔记也是在计划内的啦。不过在此之前,我们先简单的学习下一些基本的网络知

2017-03-29 20:13:41 2190 2

原创 127-POSIX 异步IO(异步通知)

到这里,终于可以采用异步的方式进行通知我们的程序异步操作完成了,在前面我们一直使用很笨很笨的方式,使用 while 循环和 aio_error 函数不断的去测试异步操作有没有完成。1. aiocb 的成员 aio_sigeventstruct aiocb { // ... struct sigevent aio_sigevent; /* 通知方法 */ // ...};aiocb

2017-03-29 15:35:48 1951 10

原创 126-POSIX 异步IO(批量请求)

POSIX 提供了函数 lio_listio 可以让我们一次性发起多个异步 IO 请求。1. lio_listio(1) 函数原型int lio_listio(int mode, struct aiocb *const aiocb_list[], int nitems, struct sigevent *sevp);(2) 函数参数modemode 有两个可选值:LIO_WAIT 和 LIO_N

2017-03-29 14:32:43 1549

原创 125-POSIX 异步IO(取消操作)

有时候,我们在请求异步 IO 后又后悔了,怎么办?POSIX 提供了一个取消函数 aio_cancel 来帮我们取消异步 IO 请求。1. aio_cancel(1) 函数原型int aio_cancel(int fd, struct aiocb *aiocbp)(2) 参数aio_cancel 有两个参数,第一个参数表示你想取消哪个描述符上的异步 IO 请求。第二个参数如果为空,表示取消该描述符上

2017-03-29 13:11:20 1431

原创 124-POSIX 异步IO(等待异步IO操作)

不知道你是否还记得线程中的 pthread_join 函数,它可以等待指定的线程完成结束后才会返回。同样的,在异步 IO 中,也有一个函数,但是它不是 aio_join,而是 aio_suspend,它会一直等待,直到指定的异步 IO 操作完成才返回。1. aio_suspendint aio_suspend(const struct aiocb * const aiocb_list[], int

2017-03-29 11:10:58 1360

原创 123-POSIX 异步IO(异步操作状态)

当你使用 aio_read 或 aio_write 等函数发起了异步读或写时,内核就自己去干活了,假设你目前还不知道异步通知的方法,你就只能不断的询问内核:“你读完没?”,正如同前面的那段程序:// 不断的检查异步读的状态,如果返回 EINPROGRESS,说明异步读还没完成// 轮询检查状态是一种很笨的方式,其实可以让操作系统用信号的方式来通知,或者让操作系统完成读后主动创建一个线程执行。在后面

2017-03-29 09:42:28 1445

原创 122-POSIX 异步IO(aiocb)

1. 引言异步 IO 就异步 IO 嘛,为什么还要加个 POSIX。如同前面我学过的进程间通信一样,有很多版本,有 System V 的函数,也有 POSIX 定义的函数,他们只是使用不同的函数未完成相同的功能而已。在这里,同样的,除了 POSIX 异步 IO 以外,还有 System V 异步 IO、BSD 异步 IO. 但是本系列的博客,只讲 POSIX 异步IO,它对应的是 aio 开头的一系

2017-03-28 17:24:35 3581 4

原创 121-同步 IO 与异步 IO

1. 引言至今为止,我们学习到的所有 IO 都是同步 IO。其主要特征是使用 read 或 write 相关系统调用,这包含了阻塞 IO、非阻塞 IO。另外前面使用的 IO 多路复用技术(select、poll 和 epoll)也是同步 IO。我有点不太理解中文版本的 apue 把 select 和 poll 说成可以实现异步形式的通知是什么意思。参考图 1. 图 1 apue 中文版本有关异

2017-03-28 14:48:40 1970 5

原创 120-epoll(边沿模式)

上一篇文章非常详细的讲解了两种触发模式。那么,到底是使用水平触发模式好呢,还是使用边沿触发模式好呢?1. 边沿触发 + 非阻塞再讨论这个问题前,我们还有一个问题没解决,就是上一篇文章中使用边沿模式还遗留了一个问题,即因为 read 的接收缓冲区太小(只有 4 字节),这导致每次缓冲区的数据读取不完,从而在下次数据到来前,即使缓冲区还有剩余数据未读取,epoll_wait 函数也会阻塞。解决此问题的方

2017-03-26 18:58:53 1447

原创 119-epoll(触发模式)

在前面,有小小的提及到了 epoll 的事件触发模式,当时说默认情况下为水平触发,另外一种情况为边沿触发。而在前面的实验中,也是使用的默认方式,即水平触发。1. 触发方式我知道,作为初始者的你已经懵圈了,触发是什么意思?在英文原文,水平触发为 level-triggered 而边沿触发为 edge-triggered. 关键在于 triggered 这个单词。来看看 Collins 词典对 trig

2017-03-24 20:06:19 2064 15

原创 118-epoll(函数)

前面了解了 epoll 的种种优点以及基本的使用框架后,相信你应该跃跃欲试了。不过再此之前,还需要将 epoll 的那个三函数细致的详解一下。1. epoll 接口epoll 提供了三个函数:int epoll_create(int size);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll

2017-03-24 10:46:57 2625 7

原创 117-epoll(基础)

epoll 是在 linux 2.6 内核之后才引入的新技术,它也是一种 IO 多路复用技术。之前已经学过了 select 和 poll,为什么还要学习新的东西?新事物的出现必然有它的道理,来分析一下前面学习过的 select 和 poll 来说明。1. IO 事件实际上,前面的 select 和 poll 已经提过过很多次事件的概念了,比如有可读事件,可写事件,实际上这并不很准确。在 IO 中,通

2017-03-23 09:34:34 1781

原创 116-poll 函数

poll 完成的功能和 select 几乎是一模一样的,所以在你学会了 select 后,你发现学 poll 会非常容易。在英文中 poll 表示“投票”的意思,这非常形象,有事件发生的描述符,就为其投票。1. poll 原型int poll(struct pollfd *fds, nfds_t nfds, int timeout);有几个参数类型可能我们不认识,实际上 pol

2017-03-22 11:30:52 1888 2

原创 115-select 与信号

1. 引言在 select 基础中已经提到过,select 函数可能会返回错误,比如使用了错误的描述符,或者被信号打断。第一种情况使用了错误的描述符,这一般是人犯的错,而第二种被信号打断,谈不上是一种真正的错误,对这种情况,程序要能考虑到。有人说,要防止 select 被信号打断,可不可以在注册信号的时候,将其设置成自动重启的?不行,对于所有的 IO 利用类函数都不支持自动重启,也就是说一旦有信号到

2017-03-22 10:06:22 3631

原创 114-select(基础)

1. 问题提出接下来再回到IO 多路复用文中提出的问题(请允许我稍作修改):// fd0 表示标准输入,即 0 号描述符, fd1, fd2 分别是以只读的方式打开的两个不同有名管道的描述符(a.fifo, b.fifo)int n;char buf[64];int fd0 = STDIN_FILENO;int fd1 = open("a.fifo", O_RDONLY);int fd2 =

2017-03-21 20:29:13 2674 1

原创 113-新的容器-fd_set

差不多在几个月前,我们学过一个装信号的容器 sigset,它通过 bit 位来保存数据。而今天要学习的 fd_set 容器,是用来装描述符的。它和 sigset 有着异曲同工之妙。1. fd_set 容器容器,说的通俗点就是用来放东西的,而且可以放很多很多。就像你家的柜子,里面有很多小隔间,一号隔间放爸爸的东西,二号隔间放妈妈的东西,三号隔间放你的东西。相比我们的 fd_set 容器,它就有更多的小

2017-03-21 19:43:34 1476 2

原创 112-IO 多路复用

1. 问题提出假设有这样一段程序:// fd1, fd2, fd3 分别是以只读的方式打开的三个不同有名管道的描述符(a.fifo, b.fifo, c.fifo)while(1) { n = read(fd1, buf, 64); write(STDOUT_FILENO, buf, n); n = read(fd2, buf, 64); write(STDOUT_FILENO, bu

2017-03-21 10:03:37 1775

原创 111-单例守护进程

有同学会很好奇,为什么这里又来一次守护进程,之前进程间关系不是已经说过一次了吗?没错,之前的确是讲过,不过那时候我们只是讲了守护进程的原理,实现方法,然而这一次并不是讲守护进程怎么实现。1. 问题提出实际上之前我们写的守护进程,如果多次启动,就会产生多个相同的进程。比如下面这样: 图1 启动几次就有几个实例 进程 processd 就是一个守护进程,每次启动都会产生一个实例,实际上很多时候守

2017-03-20 14:29:11 1279

原创 110-建议性锁和强制性锁

这两个名词非常陌生,如果你直接看 apue,可能会懵圈,不知道所云。没事,你已经找到了这一篇文章,相信你能学会。1. 提出问题假设有一个文件 b.txt,进程 A 对其进行了加锁。另外,还有一个进程 B,如果它打开了文件 b.txt,一上来就直接读写 b.txt,会不会出问题?一般来说,如果进程 A 和进程 B 都是你自己写的,你肯定会遵守规则,两个进程你都会加上加锁和解锁的代码。但是,如果进程 A

2017-03-20 13:27:37 1349

原创 109-记录锁(尾部加锁)

1. 尾部加锁与解锁在记录锁尾部加锁解锁容易产生大坑。这很隐秘,有必要提一提。比如下面的代码:wlock(fd, 0, SEEK_END, 0);// 追加一字节write(fd, buf, 1);unlock(fd, 0, SEEK_END, 0);// 再次追加一字节write(fd, buf, 1);看起来似乎很完美的一段程序,其实是有 bug 的。它运行后的结果是这样的: 图

2017-03-20 12:44:01 885

原创 108-记录锁(继承与释放)

1. 释放如果进程关闭,所有的记录锁都被释放任何一个描述符关闭,该描述符引用的文件上的任何记录都被释放。有关上面两点,实际上在上一篇文章就已经解释过了,对于同一个文件来说,无论你是 open 还是 dup 多少次,vnode 节点始终只有一份,而锁的信息是在 vnode 节点中保存。2. 继承fork 产生的子进程不继承父进程所设置的锁。这种约束是有依据的:因为记录锁的作用就是阻止多个进程

2017-03-20 12:22:48 1150 1

原创 107-记录锁(底层实现)

不知道你是否还记得文件系统相关的知识,不然下面的内容可能会让你感不到适^_^.1. 回忆先简单梳理下几个概念:文件表、文件表项文件描述符与文件表inode 节点这些内容之前都有讲过,请参考 文件IO-文件描述符与lseek,inode 节点实际上就是一个结构体对象。实际上,文件系统的实现中并没有直接采用 inode 节点,而是又抽象出了一个 vnode 节点,它是对 inode 节点的再一次

2017-03-20 11:28:08 903 2

原创 106-记录锁(测试命令)

有的时候,你并不想直接了当的对某个文件的部分内容先请求锁,只是想提前知道能不能对其加锁,然后再决定做其它的事情。1. 测试锁的方法可以将 fcntl 的 cmd 命令设置为 F_GETLK。下面这段程序演示了对文件内容进行测试加写锁。使用 F_GETLK 命令,返回的结果保存在 l_type 字段和 l_pid 字段。int testlock(int fd, int start, int len)

2017-03-20 10:32:33 985

原创 105-记录锁(基础)

在上一文简单的了解了下什么是记录锁以及掌握它所必备的前修知识。本文重点探讨如果使用 fcntl 对文件部分字节加锁。1. 加锁解锁方法1.1 加锁void wlock(int fd, int start, int len) { struct flock flk; // 加写锁,如果是加读锁,这里就写 F_RDLCK flk.l_type = F_WRLCK; // 设置参考点,参考 l

2017-03-20 09:40:28 1004

原创 104-记录锁(概念)

在很久很久以前,大概是在我们学习文件 IO 的时候吧,我们讲过 fcntl 函数,然后给了一个非常简单的例子告诉同学们如果使用 fcntl 函数对文件状态位 (比如 O_NONBLOCK 等等)进行设置。那时候我们就知道 fcntl 的功能远远不止这些,只是局限于当时我们懂的东西太少,有些东西不太适合提前讲。然而,过去半年了,大家对 Unix/Linux 环境编程应该已经相当熟悉了,进程线程,同步互

2017-03-19 18:53:38 1238

原创 103-atfork 与 fork

linux 提供了一个称之为 pthread_atfork 的函数,它允许我们事先注册三个回调函数。一旦 fork 被调用,这三个回调函数会被执行。1. 函数原型int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));上面三个回调函数,分别为 prepare 函数,parent 函数,

2017-03-18 15:14:10 1244

原创 102-多线程与 fork

在多线程程序中使用 fork,可能会导致一些意外:子进程中只剩下一个线程,它是父进程中调用 fork 的线程的副本构成。这意味着在多线程环境中,会导致“线程蒸发”,莫名奇妙的失踪!因为线程蒸发,它们所持有的锁也可能未释放,这将导致子进程在获取锁时进入死锁。本文将验证这两个问题,并给出一个可行的解决方案。1. 线程蒸发如果在多线程环境中执行 fork,派生的子进程是单线程,子进程中的线程是由父进

2017-03-17 20:26:41 1409 3

原创 101-多线程与信号(sigwait)

在上一节中,我们使用了 sigpending 从未决队列中取出信号,并打印挨个打印,这种做法相当的麻烦,而且不太科学。如果没有未决信号集中一直没有信号,岂不是在浪费 cpu?幸好,sigwait 函数可以帮我们解决这个问题。1. sigwait 函数如果在线程中调用 sigwait,它会一直等待它指定的信号,直到未决信号集中出现指定的信号为止,同时 sigwait 还会从未决信号集中取出该信号返回,

2017-03-17 17:18:51 2446

原创 100-多线程与信号

不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下。1. 多线程程序中的信号在多线程中,每一个线程都有属于自己的阻塞信号集与未决信号集。当一个线程派生另一个线程的时候,会继承父线程的阻塞信号集,但是不会继承未决信号集,并且新线程会清空未决信号集。2. 相关函数2.1 设置阻塞信号集的函数在多线程程序中,如果要设置

2017-03-17 15:15:56 1850 3

原创 99-再议 pthread_cancel

在线程创建与终止中就曾提到过 pthread_cancel 函数,它是用来终止指定的线程的,就好像线程自己调用了 pthread_exit(PTHREAD_CANCEL) 一样。不过,在那个时候并未讨论调用 pthread_cancel 后线程什么时候终止。本文主要目的就是验证 pthread_cancel 的退出时机。下面的几个程序,在线程中编写了计算密集型程序(一个很大的循环),循环执行完毕后,

2017-03-17 14:01:29 1000

原创 98-模拟 errno

这一篇,让我们搞懂 errno 的实现原理,不过为了防止名字冲突,我们换一个名字,叫 myerrno.1. 思路讲一下用到的技术吧:pthread once,参考 《只被执行一次的函数》线程私有变量,参考 《线程私有变量》本质上 errno 并不是一个真正意义上的变量,而是通过宏定义扩展为语句,而这一行语句实际上是在调用函数,该函数返回保存了指向 errno 变量的指针。这里我们直接看程序就行

2017-03-17 12:38:14 871 4

原创 97-线程私有变量

系统为每一个线程提供了一个私有“容器”,该容器中保存的是一个个的键值对。通过键可以获取值,也可以向此容器中保存值。pthread 中,对键的类型和值的类型都是有要求的。1. 键类型及相关函数键的类型是 pthread_key_t,它只能通过函数 pthread_key_create 进行初始化。它的定义如下:int pthread_key_create(pthread_key_t *key, voi

2017-03-17 11:25:37 1491

原创 96-只被执行一次的函数

本文内容以及后面的几篇文章都是在为 errno 的实现做铺垫,如果没有这些基础知识,你直接跳过去看原理可能会懵圈。1. 问题提出有时候,在执行多线程程序的时候,可能需要对某些共享资源进行初始化,一般来说,我们有两种方式:在创建线程之前进行初始化在线程函数中做初始化对于第一种方式,肯定是最常用的了,不过有时候我们并不想这么做。因为一开始可能并不需要多线程程序,所以希望我们将多线程所使用的共享资源

2017-03-17 10:34:53 1554

EasyDraw 3.0(事故树绘制)

EasyDraw 事故树软件,3.0 版本,完全免费。排版更加精致,支持生成 svg 矢量图,png/jpeg 图形。

2018-11-02

GCC 内联汇编

gcc 内联汇编 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 1.2 操作数赋值方向 1.3 前缀 1.4 间接寻址语法 1.5 后缀 1.6 指令 2 GCC 内嵌汇编 2.1 简介 2.2 内嵌汇编举例 2.3 语法 2.3.1 汇编语句模板 2.3.2 输出部分 2.3.3 输入部分 2.3.4 限制字符 2.3.5 破坏描述部分 2.4GCC 如何编译内嵌汇编代码

2018-10-28

k近邻_kd-tree_kd树_vs2008_C++代码

vs2008写的Kd树泛型算法,支持k近邻查询。

2014-12-15

梯度下降法VS2008_C++

梯度下降法完整的VS2008代码。博客地址:http://blog.csdn.net/q1007729991/article/details/40382071

2014-10-23

事故树绘制软件easydraw免费V2.19

免费版本的事故软件,实现所有计算功能,节点自动调整,建树判错等功能!支持导出图片。

2013-12-13

增强版事故树绘制与分析程序

1.完善建立事故树的过程 2.事故树节点自动排列,免去手工排列节点的烦恼 3.编号自动生成,免去手工编号的繁琐 4.自动检测是否有闭环回路,防止用户建立逻辑上错误的事故树 5.自动检测用户是否在一个事件下重复添加 6.相同事件下建立节点,会进行同步复制,提高建树效率 7.相同事件下删除节点,会进行同步删除 8.手工拖动节点时自动对齐 9.修改节点信息,所有相同节点进行同步修改 10.画布大小自定义 11.画布颜色,事件框颜色,门颜色,文字颜色可以自定义 12.完美的一键保存bmp图片功能 13.编码树与文字树一键切换 14.列出事件清单,方便用户一次性输入事件概率 15.完善顶上事件概率计算,提供最小割集逼近法,无重复基本事件计算法,首项近似法,以及事件状态组合法。 16.优化最小割集、径集算法,提高计算速度 17.结构重要度删除不必要的状态组合法,仅提供公式三计算结果 18.提高了概率重要度、关键重要度的计算精度

2013-04-19

事故树绘制分析软件

简单易用,功能其全的一个事故树绘制分析软件,用以计算最小割集,最小径集,顶上事件概率,概率重要度,结构重要度,临界重要度,计算方法可选。 计算的结果可以保存到本地txt文本文件,方便您复制到您需要的地方,给您的论文写作也会带来极大方便。概率计算提供一套精确算法,可以根据您所提供的数据计算出精确结果。当然您也可以选择近似算法,本软件提供首项近似法和平均近似法的计算结果,给您多种选则。软件非常简单易用,自己几分钟就可以学会,谢谢您的使用!

2012-12-17

MFC 音乐播放器

基本上实现了常用的播放功能,可以自动下一首,通过音量条控制音量,实现时间进度栏,实现将添加到列表的歌曲文件列表存储到本地,下次启动的时候依然还在,更多功能等待你的发觉,不要说分高,学习才是王道,尊重作者的劳动成果,花了两天时间写的。

2012-12-12

汇编_单片机_matlab_Multisim等

注意:此为TXT文档,里面都有下载地址,你所要下载的东东都在我的u115网盘里! 静态反汇编工具W32Dasm.rar 51单片机种子全.rar win7系统工具.rar matlab详细教程.rar Multisim教程.exe 中国象棋经典残局《适情雅趣》_0.1.exe UltraEdit-32_V16.20.0.1009_汉化版(30天免费使用).exe 精美PPT模板_2009.11.30.zip VC6.0简体中文企业版.rar

2010-11-24

空空如也

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

TA关注的人

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