Linux高性能服务器编程

出版社:游双 机械工业出版社 (2013-05出版)
出版日期:2013-5-1
ISBN:9787111425199
作者:游双
页数:360页

前言

前言为什么要写这本书目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞。很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚。有些书籍给读者展现的是网络上随处可见的知识,基本没有自己的观点,甚至连一点自己的总结都没有。反观大师们的经典书籍,整本书只专注于一个问题,而且对每个技术细节的描述都是精雕细琢。最关键的是,我们在阅读这些经典书籍时,似乎是在用心与一位编程高手交流,这绝对是一种享受。我们把问题缩小到计算机网络编程领域。关于计算机网络编程的相关书籍,不得不提的是已故网络教育巨匠W•Richard Stevens先生的《TCP/IP协议详解》(三卷本),以及《UNIX网络编程》(两卷本)。作为一名网络程序员,即使没有阅读过这几本书,也应该听说过它们。但这几本书中的内容实在是太庞大了,没有耐心的读者根本不可能把它们全部读完。而且对于英文不太好的朋友来说,选择阅读其翻译版本又有失原汁原味。基于以上两点原因,笔者编写了这本《Linux高性能服务器编程》。本书是笔者多年来学习网络编程之总结,是在充分理解大师的作品并融入自己的理解和见解后写成的。本书讨论的主题和定位很明确。简单来说就是:如何通过各种手段编写高性能的服务器程序。网络技术是在不断向前发展的,比如Linux提供的epoll机制就是在内核2.6版本之后才正式引入的。但是,编程思想却可以享用一辈子。我们在不断学习并使用新技术,不断适应新环境的同时,书中提到的网络编程思想能让我们看得更远,想得更多。笔者相信,没有谁会认为W•Richard Stevens先生的网络编程书籍过时了。读者对象阅读本书之前,读者需要了解基本的计算机网络知识,并具有一定的Linux系统编程和C++编程基础,否则阅读起来会有些困难。本书读者对象主要包括:Linux网络应用程序开发人员Linux系统程序开发人员C/C++程序开发人员对网络编程技术感兴趣,或希望参与网络程序开发的人员开设相关课程的大专院校师生本书特色本书的特点:不求内容宽泛,但求专而精,深入地剖析服务器编程的要素;不求内容精准,但求融入笔者自己的理解和观点,可谓“另眼”看服务器编程。如何提高服务器程序性能是本书要着重讨论的。第6、8、9、11、12、15、16等章中都用了相当的篇幅讨论这一主题。其论述方法是:首先,探讨提高服务器程序性能的一般原则,比如使用“池”以牺牲空间换取效率,使用零拷贝函数以避免内核和用户空间的切换等;其次,介绍一些高效的编程模式及其应用,比如使用有限状态机来分析用户数据,使用进程池或线程池来处理用户请求;最后,探讨如何通过调整系统参数来从服务器程序外部提高其整体性能。光说不练假把式。如果没有实例,或者只是给出几个“Hello World”,那么本书就真没有出版的必要了。笔者要做的是让读者能真正把理论和实践完美地结合起来。在写作本书之前,笔者阅读了不少开源社区的优秀服务器软件的源代码,自己也写过相当多的小型服务器程序。这些软件中那些最精彩的部分,在书中都有充分的体现。比如第15章给出的两个实例——用进程池实现的简单CGI服务器和用线程池实现的简单Web服务器,就充分展现了如何利用各种提高服务器性能的手段来高效地解决实际问题。此外,为了帮助读者进一步把书中的知识融汇到实际项目中,笔者还特意编写了一个较为完整的负载均衡服务器程序springsnail。该程序能从所有逻辑服务器中选取负荷最小的一台来处理新到的客户连接。在这个程序中,使用了进程池、有限状态机、高效数据结构来提高其性能;同时,细致地封装了每个函数和模块,使之更符合实际工程项目。由于篇幅的限制,笔者未将该程序的源代码列在书中,读者可从华章网站上下载它。如何阅读本书本书分为三篇:第一篇(第1~4章)介绍TCP/IP协议族及各种重要的网络协议。只有很好地理解了底层TCP/IP通信的过程,才能编写出高质量的网络应用程序。毕竟,坚实的基础设施造就稳固的上层建筑。第二篇(第5~15章)细致地剖析了服务器编程的各主要方面,其中对每个重要的概念、模型以及函数等都以实例代码的形式加以阐述。这一篇又可细分为如下四个部分:第一部分(第5~7章)介绍Linux操作系统为网络编程提供的众多API。这些API就像是基本的音符,我们通过组织它们来谱写优美的旋律。第二部分(第8章)探讨高性能服务器程序的一般框架。在这一部分中,我们将服务器程序解构为I/O单元、逻辑单元和存储单元三个部件,并重点介绍了I/O单元、逻辑单元的几种高效实现模式。此外,我们还探讨了提高服务器性能的其他建议。第三部分(第9~12章)深入剖析服务器程序的I/O单元。我们将探讨I/O单元需要处理的I/O事件、信号事件和定时事件,并介绍一款优秀的开源I/O框架库——Libevent。第四部分(第13~15章)深入剖析服务器程序的逻辑单元。这一部分我们要讨论多线程、多进程编程,以及高性能逻辑处理模型——进程池和线程池,并给出相应的实例代码。第三篇(第16~17章)探讨如何从系统的角度优化和监测服务器性能。本篇的内容涉及服务器程序的调制、调试和测试,以及诸多常用系统监测工具的使用。勘误和支持由于作者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。书中的全部源文件都可以从华章网站下载。期待能够得到您的真挚反馈。致谢首先要感谢伟大的网络教育导师W•Richard Stevens先生,他的书籍帮助了无数的网络程序开发人员,也给笔者指明了学习的道路。感谢机械工业出版社华章公司的编辑杨福川老师和孙海亮老师,是他们在这两年多的时间中始终支持着我的写作,因为有了他们的鼓励、帮助和引导,笔者才能顺利完成全部书稿。感谢好友史正政,他对编程充满热爱,也无私地为本书提供了原材料。谨以此书献给我最亲爱的家人和朋友,以及那些为计算机网络教育做出巨大贡献的大师们,还有正在为自己的未来努力拼搏、充满朝气和活力的IT工程师们!游双于北京

内容概要

游双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的技术。活跃于Chinaunix等专业技术社区,发表了大量关于Linux网络编程的文章,深受社区欢迎。

书籍目录

前言
第一篇 TCPIP协议详解
第1章 TCPIP协议族
1.1 TCPIP协议族体系结构以及主要协议
1.1.1 数据链路层
1.1.2 网络层
1.1.3 传输层
1.1.4 应用层
1.2 封装
1.3 分用
1.4 测试网络
1.5 ARP协议工作原理
1.5.1 以太网ARP请求应答报文详解
1.5.2 ARP高速缓存的查看和修改
1.5.3 使用tcpdump观察ARP通信过程
1.6 DNS工作原理
1.6.1 DNS查询和应答报文详解
1.6.2 Linux下访问DNS服务
1.6.3 使用tcpdump观察DNS通信过程
1.7 socket和TCPIP协议族的关系
第2章 IP协议详解
2.1 IP服务的特点
2.2 IPv4头部结构
2.2.1 IPv4头部结构
2.2.2 使用tcpdump观察IPv4头部结构
2.3 IP分片
2.4 IP路由
2.4.1 IP模块工作流程
2.4.2 路由机制
2.4.3 路由表更新
2.5 IP转发
2.6 重定向
2.6.1 ICMP重定向报文
2.6.2 主机重定向实例
2.7 IPv6头部结构
2.7.1 IPv6固定头部结构
2.7.2 IPv6扩展头部
第3章 TCP协议详解
3.1 TCP服务的特点
3.2 TCP头部结构
3.2.1 TCP固定头部结构
3.2.2 TCP头部选项
3.2.3 使用tcpdump观察TCP头部信息
3.3 TCP连接的建立和关闭
3.3.1 使用tcpdump观察TCP连接的建立和关闭
3.3.2 半关闭状态
3.3.3 连接超时
3.4 TCP状态转移
3.4.1 TCP状态转移总图
3.4.2 TIME_WAIT状态
3.5 复位报文段
3.5.1 访问不存在的端口
3.5.2 异常终止连接
3.5.3 处理半打开连接
3.6 TCP交互数据流
3.7 TCP成块数据流
3.8 带外数据
3.9 TCP超时重传
3.10 拥塞控制
3.10.1 拥塞控制概述
3.10.2 慢启动和拥塞避免
3.10.3 快速重传和快速恢复
第4章 TCPIP通信案例:访问Internet上的Web服务器
4.1 实例总图
4.2 部署代理服务器
4.2.1 HTTP代理服务器的工作原理
4.2.2 部署squid代理服务器
4.3 使用tcpdump抓取传输数据包
4.4 访问DNS服务器
4.5 本地名称查询
4.6 HTTP通信
4.6.1 HTTP请求
4.6.2 HTTP应答
4.7 实例总结
第二篇 深入解析高性能服务器编程
第5章 Linux网络编程基础API
5.1 socket地址API
5.1.1 主机字节序和网络字节序
5.1.2 通用socket地址
5.1.3 专用socket地址
5.1.4 IP地址转换函数
5.2 创建socket
5.3 命名socket
5.4 监听socket
5.5 接受连接
5.6 发起连接
5.7 关闭连接
5.8 数据读写
5.8.1 TCP数据读写
5.8.2 UDP数据读写
5.8.3 通用数据读写函数
5.9 带外标记
5.10 地址信息函数
5.11 socket选项
5.11.1 SO_REUSEADDR选项
5.11.2 SO_RCVBUF和SO_SNDBUF选项
5.11.3 SO_RCVLOWAT和SO_SNDLOWAT选项
5.11.4 SO_LINGER选项
5.12 网络信息API
5.12.1 gethostbyname和gethostbyaddr
5.12.2 getservbyname和getservbyport
5.12.3 getaddrinfo
5.12.4 getnameinfo
第6章 高级IO函数
6.1 pipe函数
6.2 dup函数和dup2函数
6.3 readv函数和writev函数
6.4 sendfile函数
6.5 mmap函数和munmap函数
6.6 splice函数
6.7 tee函数
6.8 fcntl函数
第7章 Linux服务器程序规范
7.1 日志
7.1.1 Linux系统日志
7.1.2 syslog函数
7.2 用户信息
7.2.1 UID、EUID、GID和EGID
7.2.2 切换用户
7.3 进程间关系
7.3.1 进程组
7.3.2 会话
7.3.3 用ps命令查看进程关系
7.4 系统资源限制
7.5 改变工作目录和根目录
7.6 服务器程序后台化
第8章 高性能服务器程序框架
8.1 服务器模型
8.1.1 CS模型
8.1.2 P2P模型
8.2 服务器编程框架
8.3 IO模型
8.4 两种高效的事件处理模式
8.4.1 Reactor模式
8.4.2 Proactor模式
8.4.3 模拟Proactor模式
8.5 两种高效的并发模式
8.5.1 半同步半异步模式
8.5.2 领导者追随者模式
8.6 有限状态机
8.7 提高服务器性能的其他建议
8.7.1 池
8.7.2 数据复制
8.7.3 上下文切换和锁
第9章 IO复用
9.1 select系统调用
9.1.1 select API
9.1.2 文件描述符就绪条件
9.1.3 处理带外数据
9.2 poll系统调用
9.3 epoll系列系统调用
9.3.1 内核事件表
9.3.2 epoll_wait函数
9.3.3 LT和ET模式
9.3.4 EPOLLONESHOT事件
9.4 三组IO复用函数的比较
9.5 IO复用的高级应用一:非阻塞connect
9.6 IO复用的高级应用二:聊天室程序
9.6.1 客户端
9.6.2 服务器
9.7 IO复用的高级应用三:同时处理TCP和UDP服务
9.8 超级服务xinetd
9.8.1 xinetd配置文件
9.8.2 xinetd工作流程
第10章 信号
10.1 Linux信号概述
10.1.1 发送信号
10.1.2 信号处理方式
10.1.3 Linux信号
10.1.4 中断系统调用
10.2 信号函数
10.2.1 signal系统调用
10.2.2 sigaction系统调用
10.3 信号集
10.3.1 信号集函数
10.3.2 进程信号掩码
10.3.3 被挂起的信号
10.4 统一事件源
10.5 网络编程相关信号
10.5.1 SIGHUP
10.5.2 SIGPIPE
10.5.3 SIGURG
第11章 定时器
11.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO
11.2 SIGALRM信号
11.2.1 基于升序链表的定时器
11.2.2 处理非活动连接
11.3 IO复用系统调用的超时参数
11.4 高性能定时器
11.4.1 时间轮
11.4.2 时间堆
第12章 高性能IO框架库Libevent
12.1 IO框架库概述
12.2 Libevent源码分析
12.2.1 一个实例
12.2.2 源代码组织结构
12.2.3 event结构体
12.2.4 往注册事件队列中添加事件处理器
12.2.5 往事件多路分发器中注册事件
12.2.6 eventop结构体
12.2.7 event_base结构体
12.2.8 事件循环
第13章 多进程编程
13.1 fork系统调用
13.2 exec系列系统调用
13.3 处理僵尸进程
13.4 管道
13.5 信号量
13.5.1 信号量原语
13.5.2 semget系统调用
13.5.3 semop系统调用
13.5.4 semctl系统调用
13.5.5 特殊键值IPC_PRIVATE
13.6 共享内存
13.6.1 shmget系统调用
13.6.2 shmat和shmdt系统调用
13.6.3 shmctl系统调用
13.6.4 共享内存的POSIX方法
13.6.5 共享内存实例
13.7 消息队列
13.7.1 msgget系统调用
13.7.2 msgsnd系统调用
13.7.3 msgrcv系统调用
13.7.4 msgctl系统调用
13.8 IPC命令
13.9 在进程间传递文件描述符
第14章 多线程编程
14.1 Linux线程概述
14.1.1 线程模型
14.1.2 Linux线程库
14.2 创建线程和结束线程
14.3 线程属性
14.4 POSIX信号量
14.5 互斥锁
14.5.1 互斥锁基础API
14.5.2 互斥锁属性
14.5.3 死锁举例
14.6 条件变量
14.7 线程同步机制包装类
14.8 多线程环境
14.8.1 可重入函数
14.8.2 线程和进程
14.8.3 线程和信号
第15章 进程池和线程池
15.1 进程池和线程池概述
15.2 处理多客户
15.3 半同步半异步进程池实现
15.4 用进程池实现的简单CGI服务器
15.5 半同步半反应堆线程池实现
15.6 用线程池实现的简单Web服务器
15.6.1 http_conn类
15.6.2 main函数
第三篇 高性能服务器优化与监测
第16章 服务器调制、调试和测试
16.1 最大文件描述符数
16.2 调整内核参数
16.2.1 procsysfs目录下的部分文件
16.2.2 procsysnet目录下的部分文件
16.3 gdb调试
16.3.1 用gdb调试多进程程序
16.3.2 用gdb调试多线程程序
16.4 压力测试
第17章 系统监测工具
17.1 tcpdump
17.2 lsof
17.3 nc
17.4 strace
17.5 netstat
17.6 vmstat
17.7 ifstat
17.8 mpstat
参考文献

编辑推荐

《Linux高性能服务器编程》编辑推荐:Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写。从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,包含两个综合性案例,极具实战意义。

作者简介

本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅理论全面、深入,抓住了重点和难点,还包含两个综合性案例,极具实战意义。
全书共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP/IP通信案例;第二部分对高性能服务器编程的核心要素进行了全面深入的剖析,包含Linux网络编程API、高级I/O函数、Linux服务器程序规范、高性能服务器程序框架、I/O复用、信号、定时器、高性能I/O框架库Libevent、多进程编程、多线程编程、进程池和线程池等内容,原理、技术与方法并重;第三部分从侧重实战的角度讲解了高性能服务器的优化与监测,包含服务器的调制、调试和测试,以及各种实用系统监测工具的使用等内容。


 Linux高性能服务器编程下载 更多精彩书评



发布书评

 
 


精彩书评 (总计3条)

  •     非常推荐要说讲基础,这本书第一部分讲TCP协议的各状态,通过tcpdump工具,一个个做实验,用数据包告诉你,tcp是这么进行各状态跳转的,可见作者对tcp/ip协议和socket的基础深厚,理解透彻。要说看内容,本书作者开始讲高性能服务器编程前讲各种IO模型和通用高性能框架,对现阶段的我启发很大,我正在做此类开发。力荐的一本书
  •     在64位的CentOS 6系统上,大小端转换函数定义如下:(man 3 htonl)SYNOPSIS#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);可见它们还是用于32位、16位的函数,与系统是x86还是x86_64无关。
  •     我想要对一些应用进行性能优化的书,比如mysql集群和nginx集群优化的技术。这本书主要是一些功能的开发,并不研究这块。我想要对一些应用进行性能优化的书,比如mysql集群和nginx集群优化的技术。这本书主要是一些功能的开发,并不研究这块。

精彩短评 (总计59条)

  •     主要介绍了一些常用的API和工具,希望作者出个第二版 可以写再详细一些
  •     里面的例子很丰富,示例代码容易读懂。
  •     对高性能服务器编程的点都讲到了,重点突出,实例讲解也很丰富。
  •     书中的示例代码还是不错的
  •     大部分内容APUE和UNP里面都有讲过,不过这本书也讲到了那两本书里面所没有的知识,比如epoll、Reactor/Proactor模式和进程池等东西。
  •     总体还是不错的,看了我想看的部分,没有全部看完
  •     写的有点乱 而且太杂
  •     国内一流的技术书籍, 抓住了网络编程的重点. 13,14没有结合网络编程这块.小有遗憾
  •     适合入门
  •     实践性的内容,收获了很多,对于libevent,初次接触还是先看官方文档,然后再应用,可以看下memcached如何应用的。
  •     只能说入门书吧,讲得还算比较清晰,推荐
  •     这本书明显没有什么深层次的东西,那些货在网上就能找到
  •     这方面的书好少
  •     这本书很实在,有理论有实践,基础的讲得很细致,实践的部分也挺有用。我网络入门就是看的这本书,国产中难得的佳作
  •     网络编程关键点基本覆盖,实例也举得不错,但是其中的海量细节还是逃不掉W.Richard Stevens那三本书!
  •     把基本的服务器开发介绍的很好,比较集中的讲解服务器开发。挺好的
  •     非常不错,良心与心血之作
  •     很好很全面,不啰嗦,叙述简洁明了,很值
  •     读过一遍,还需要读第二遍。书不错。
  •     入门或进阶都是比较合适的,书的后半部分某些细节有点API的堆积了,整体还是很好的
  •     这本书值得一个五星。 12章前面的内容十分精彩,十分有教益和启发。即使看到第12章是对其篇幅,第十三章看似资料采集,这本书仍然值得五星。 这五星,给他是因为下面几点:1、内容编排很好,不管文章怎样,目录就是一个很好的学习提纲。2、前十一章讲得深入浅出,看得出作者花了很多功夫,这是很多书做不到的。3、十五章后面的内容实践性较强,也是不错。
  •     看了下目录,这个确实和书的简介不大一致;书的简介称求深入而不求广泛,但从目录来看,内容很宽泛,都不深入,呵呵
  •     还行!!正在看,看完再来评论
  •     全是干货,适合我这种写过linux 服务器程序,但是知识结构盲点还很多的人看。
  •     去年看过的一本很不错的书,这本书讲了TCP的各种高性能编程基础,select/poll/epoll等IO复用讲得不错,还讲了几种定时器的实现方式。很推荐~~~
  •     还是不错的,必须的部分基本都覆盖到了,而且篇幅也适合快速上手
  •     感觉这本书讲的挺不错的,虽然linux编程当然Unix环境高级编程是一本经典,而且讲的也很全,很仔细,但是,说实话不太好懂,已经看了第二遍了,还是懵懵的。 看Unix环境高级编程到第5章开始看这本书,看的比较快,下面抽时间谢谢笔记,加深一下印象。 里面的例子也不错,适合我这样入门的人
  •     很不错的书籍,粗读了一篇,里面讲的内容非常不错,多线程,libevent等。
  •     挺好的一本书,从工具到方法到比较高效的API都介绍了一下,花上几个下午快速过一下挺有帮助的。
  •     这本书的内容其实很多书中都可以找到,但是之所以买这本书,主要是他归纳整理了关键知识点,内容比较浅,但是对于理清思路和知识整理还是很有用的
  •     收获还是挺大的,只是书写的不够严谨,比如epoll_fd没有close().有些代码感觉有问题
  •     作为入门书籍还是不错,比较接地气
  •     自学 linux 服务器开发时候学的。内容少广,针对实践上的东西会讲的深入一些。和 linux 网络开发那两本书一起看效果会好点。有c++和 linux 基础的人看
  •     读了一下,梳理了很多知识点
  •     这本书纯粹是个函数手册,里面都是各种API的介绍,偶尔贴上大段代码。不建议读。
  •     为什么看了几页之后,我觉得是本很好的入门书,至少前几章是这样子的
  •     算是比较简单的入门书籍吧!有的地方代码写错了.我不知道作者是粗心还是怎么,不过总结的倒是挺不错的.
  •     基本概念解释的挺清楚。再理了一遍。
  •     偏实战 精彩 可结合《Unix环境高级编程》一起
  •     挺有启发的.............
  •     正在读,加油哦~ 前面讲协议的部分并没有什么卵用
  •     讲的一般,都是基础知识,书名说的有点高大上了。
  •     书不错!值得学习,网络编程,快速上手
  •     书的组织不是很好,语言表达也并非完美,可以看出一些拼凑的痕迹(个人感觉)。不过对于入门的初学者来说,总是能学到一些东西,因为内容还是比较丰富的。
  •     从tcpdump中学习TCP/IP协议。
  •     不重要的东西废话很多,重点的东西泛泛而谈。
  •     代码硬伤较多,例如非阻塞write没有一次写对。且没有体现“高性能”。
  •     覆盖面很广,感觉可以作为 W.Richard Stevens 写的六本书的一个缩小版。
  •     入门算不上,开阔眼界吧。没有APUE和UNP的基础,是看不下去的。像是总结笔记,覆盖了大部分网络编程的知识,但都是轻轻带过...
  •     适合查阅
  •     代码堆积太多
  •     几个点都提到了,但是感觉讲的不是特别灵光,可能是读steven的书读习惯了
  •     质量很高,不像一般的只是粘贴代码的技术书,有作者的个人理解在里面。
  •     挺好,前几章内容在tcp,apue,unp里已经被老stevens写通透的就没什么说了。服务器io模型和进程池线程池等最后几章归纳得很好,至少还没见过老外写的书有这么具体的总结的。看上去现在服务器后台貌似都是用C++多了?另外有些错误的地方,多倒是不多不过看上去不舒服。还有作者可能长年只战斗在Linux上,对POSIX和C可移植性貌似不是特别敏感,可能是偶尔写到的时候看到资料里提了,所以同时提了一下,一笔带过。
  •     买了书的同学发现了没有, 书里面的很多内容在网上能够搜索到一字不差的......
  •     (1).不适合入门,涉及面太广。需要再读几遍才能吃透。(2).特别适合有一定的Linuc c/c++服务端经验的人,虽然讲解的很全面,但不太深。不过还是很值得细看几遍的!!
  •     这是一个程序员的总结笔记。
  •     算是本土作者写的书中很不错的一本了,当然在一些地方还是可以改进~~~
  •     作为知识总结还是不错的
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024