• C++服务器开发精髓
21年品牌 40万+商家 超1.5亿件商品

C++服务器开发精髓

全新正版 极速发货

85.93 5.1折 168 全新

库存6件

广东广州
认证卖家担保交易快速发货售后保障

作者张远龙

出版社电子工业出版社

ISBN9787121412639

出版时间2021-07

装帧平装

开本16开

定价168元

货号31172650

上书时间2024-06-05

书香美美

已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
目录
第1章  C++必知必会1
1.1  C++ RAII惯用法1
1.1.1  版本1:最初的写法1
1.1.2  版本2:使用goto语句3
1.1.3  版本3:使用do...while(0)循环5
1.1.4  版本4:使用RAII惯用法7
1.1.5  小结12
1.2  pimpl惯用法12
1.3  C++ 11/14/17新增的实用特性17
1.4  统一的类成员初始化语法与std::initializer_list<T>19
1.5  C++ 17注解标签(attributes)24
1.5.1  C++ 98/03的enumeration和C++ 11的enumerator25
1.5.2  C++ 17的注解标签25
1.6  final、override关键字和=default、=delete语法28
1.6.1  final关键字28
1.6.2  override关键字29
1.6.3  =default语法31
1.6.4  =delete语法32
1.7  auto关键字的用法34
1.8  Range-based循环语法35
1.8.1  自定义对象如何支持Range-based循环语法37
1.8.2  for-each循环的实现原理38
1.9  C++ 17结构化绑定39
1.10  stl容器新增的实用方法43
1.10.1  原位构造与容器的emplace系列函数43
1.10.2  std::map的try_emplace方法与insert_or_assign方法44
1.11  stl 中的智能指针类详解52
1.11.1  C++ 98/03的尝试――std::auto_ptr52
1.11.2  std::unique_ptr55
1.11.3  std::shared_ptr59
1.11.4  std::enable_shared_from_this61
1.11.5  std::weak_ptr63
1.11.6  智能指针对象的大小67
1.11.7  使用智能指针时的注意事项68
第2章  C++后端开发必备的工具和调试知识71
2.1  SSH工具与FTP工具71
2.1.1  Xshell71
2.1.2  FTP75
2.2  makefile与CMake76
2.3  使用Visual Studio管理和阅读开源项目代码83
2.4  gdb调试87
2.4.1  被调试的程序需要带调试信息87
2.4.2  启动gdb调试的方法89
2.5  gdb常用命令详解――利用gdb调试Redis94
2.5.1  gdb常用调试命令概览和说明94
2.5.2  用gdb调试Redis前的准备工作96
2.5.3  run命令97
2.5.4  continue命令98
2.5.5  break命令98
2.5.6  tbreak命令101
2.5.7  backtrace与frame命令101
2.5.8  info break、enable、disable、delete命令102
2.5.9  list命令104
2.5.10  print与ptype命令107
2.5.11  info与thread命令109
2.5.12  next、step、until、finish、return、jump命令112
2.5.13  disassemble命令122
2.5.14  set args与show args命令122
2.5.15  watch命令123
2.5.16  display命令124
2.5.17  dir命令125
2.6  使用gdb调试多线程程序126
2.6.1  调试多线程程序的方法126
2.6.2  在调试时控制线程切换128
2.7  使用gdb调试多进程程序――以调试Nginx为例137
2.8  gdb实用调试技巧143
2.8.1  将print输出的字符串或字符数组完整显示144
2.8.2  让被gdb调试的程序接收信号144
2.8.3  函数明明存在,添加断点时却无效145
2.8.4  调试中的断点146
2.8.5  自定义gdb调试命令147
2.9  gdb tui――gdb图形化界面148
2.9.1  开启gdb TUI模式149
2.9.2  gdb TUI模式下的4个窗口149
2.9.3  解决tui窗口不自动更新内容的问题150
2.9.4  窗口焦点切换150
2.10  gdb的升级版――cgdb151
2.11  使用VisualGDB调试154
2.11.1  使用VisualGDB调试已经运行的程序155
2.11.2  使用VisualGDB从头调试程序156
第3章  多线程编程与资源同步159
3.1  线程的基本概念及常见问题159
3.1.1  主线程退出,支线程也将退出吗159
3.1.2  某个线程崩溃,会导致进程退出吗160
3.2  线程的基本操作160
3.2.1  创建线程160
3.2.2  获取线程ID166
3.2.3  等待线程结束173
3.3  惯用法:将C++类对象实例指针作为线程函数的参数178
3.4  整型变量的原子操作184
3.4.1  为什么给整型变量赋值不是原子操作185
3.4.2  Windows平台上对整型变量的原子操作186
3.4.3  C++ 11对整型变量原子操作的支持187
3.5  Linux线程同步对象190
3.5.1  Linux互斥体190
3.5.2  Linux信号量198
3.5.3  Linux条件变量202
3.5.4  Linux读写锁208
3.6  Windows线程同步对象217
3.6.1  WaitForSingleObject与WaitForMultipleObjects函数217
3.6.2  Windows临界区对象219
3.6.3  Windows Event对象224
3.6.4  Windows Mutex对象229
3.6.5  Windows Semaphore对象231
3.6.6  Windows读写锁235
3.6.7  Windows条件变量238
3.6.8  在多进程之间共享线程同步对象243
3.7  C++ 11/14/17线程同步对象244
3.7.1  std::mutex系列244
3.7.2  std::shared_mutex248
3.7.3  std::condition_variable253
3.8  如何确保创建的线程一定能运行256
3.9  多线程使用锁经验总结258
3.9.1  减少锁的使用次数258
3.9.2  明确锁的范围259
3.9.3  减少锁的使用粒度259
3.9.4  避免死锁的一些建议260
3.9.5  避免活锁的一些建议262
3.10  线程局部存储262
3.10.1  Windows的线程局部存储262
3.10.2  Linux的线程局部存储264
3.10.3  C++ 11 的 thread_local 关键字267
3.11  C库的非线程安全函数268
3.12  线程池与队列系统的设计270
3.12.1  线程池的设计原理270
3.12.2  环形队列275
3.12.3  消息中间件275
3.13  纤程(Fiber)与协程(Routine)277
3.13.1  纤程277
3.13.2  协程280

第4章  网络编程重难点解析282
4.1  学习网络编程时应该掌握的socket函数282
4.1.1  在Linux上查看socket函数的帮助信息283
4.1.2  在Windows上查看socket函数的帮助信息285
4.2  TCP网络通信的基本流程286
4.3  设计跨平台网络通信库时的一些socket函数用法290
4.3.1  socket数据类型290
4.3.2  在Windows上调用socket函数290
4.3.3  关闭socket函数291
4.3.4  获取socket函数的错误码291
4.3.5  套接字函数的返回值293
4.3.6  select函数第1个参数的问题293
4.3.7  错误码WSAEWOULDBLOCK和EWOULDBLOCK294
4.4  bind函数重难点分析294
4.4.1  对bind函数如何选择绑定地址294
4.4.2  bind函数的端口号问题295
4.5  select函数的用法和原理302
4.5.1  Linux上的select函数302
4.5.2  Windows上的select函数317
4.6  socket的阻塞模式和非阻塞模式318
4.6.1  如何将socket设置为非阻塞模式318
4.6.2  send和recv函数在阻塞和非阻塞模式下的表现320
4.6.3  非阻塞模式下send和recv函数的返回值总结331
4.6.4  阻塞与非阻塞socket的各自适用场景333
4.7  发送0字节数据的效果333
4.8  connect函数在阻塞和非阻塞模式下的行为339
4.9  连接时顺便接收第1组数据343
4.10  如何获取当前socket对应的接收缓冲区中的可读数据量346
4.10.1  分析346
4.10.2  注意事项350
4.11  Linux EINTR错误码351
4.12  Linux SIGPIPE信号352
4.13  Linux poll 函数的用法353
4.14  Linux epoll模型361
4.14.1  基本用法361
4.14.2  epoll_wait与poll函数的区别363
4.14.3  LT 模式和ET 模式363
4.14.4  EPOLLONESHOT 选项380
4.15  高效的readv和writev函数386
4.16  主机字节序和网络字节序387
4.16.1  主机字节序387
4.16.2  网络字节序388
4.16.3  操作系统提供的字节转换函数汇总389
4.17  域名解析API介绍390
第5章  网络通信故障排查常用命令397
5.1  ifconfig命令397
5.2  ping命令401
5.3  telnet命令402
5.4  netstat命令407
5.5  lsof命令409
5.6  nc命令412
5.7  curl命令415
5.8  tcpdump命令416
第6章  网络通信协议设计422
6.1  理解TCP422
6.2  如何解决粘包问题423
6.3  解包与处理425
6.4  从struct到TLV430
6.4.1  协议的演化430
6.4.2  协议的分类434
6.4.3  协议设计工具434
6.5  整型数值的压缩435
6.6  设计通信协议时的注意事项437
6.6.1  字节对齐437
6.6.2  显式地指定整型字段的长度438
6.6.3  涉及浮点数时要考虑精度问题438
6.6.4  大小端问题438
6.6.5  协议与自动升级功能438

6.7  包分片439
6.8  XML与JSON格式的协议444
6.9  一个自定义协议示例445
6.10  理解HTTP460
6.10.1  HTTP格式介绍460
6.10.2  GET与POST方法461
6.10.3  HTTP chunk编码465
6.10.4  HTTP客户端的编码实现466
6.10.5  HTTP服务端的实现466
6.10.6  HTTP与长连接471
6.10.7  libcurl471
6.10.8  Restful接口与Java Spring MVC477
6.11  SMTP、POP3与邮件客户端478
6.11.1  邮件协议简介478
6.11.2  SMTP479
6.11.3  POP3494
6.11.4  邮件客户端499
6.12  WebSocket协议499
6.12.1  WebSocket协议的握手过程500
6.12.2  WebSocket协议的格式503
6.12.3  WebSocket协议的压缩格式506
6.12.4  WebSocket协议装包与解包示例508
6.12.5  解析握手协议512
第7章  单个服务的基本结构515
7.1  网络通信组件的效率问题515
7.1.1  高效网络通信框架的设计原则515
7.1.2  连接的被动关闭与主动关闭519
7.1.3  长连接和短连接519
7.2  原始的服务器结构520
7.3  一个连接对应一个线程模型522
7.4  Reactor模式523
7.5  one thread one loop思想524
7.5.1  one thread one loop程序的基本结构524
7.5.2  线程的分工525
7.5.3  唤醒机制的实现527
7.5.4  handle_other_things方法的实现逻辑532
7.5.5  带定时器的程序结构533
7.5.6  one thread one loop的效率保障534
7.6  收发数据的正确做法534
7.6.1  如何收取数据534
7.6.2  如何发送数据535
7.6.3  不要多个线程同时利用一个socket收(发)数据538
7.7  发送、接收缓冲区的设计要点538
7.7.1  为什么需要发送缓冲区和接收缓冲区539
7.7.2  如何设计发送缓冲区和接收缓冲区539
7.7.3  服务端发送数据时对端一直不接收的问题543
7.8  网络库的分层设计544
7.8.1  网络库设计中的各个层544
7.8.2  将Session进一步分层550
7.8.3  连接信息与EventLoop/Thread的对应关系551
7.9  后端服务中的定时器设计551
7.9.1  最简单的定时器551
7.9.2  定时器设计的基本思路552
7.9.3  定时器逻辑的性能优化561
7.9.4  对时间的缓存564
7.10  处理业务数据时是否一定要单独开线程565
7.11  非侵入式结构与侵入式结构570
7.11.1  非侵入式结构570
7.11.2  侵入式结构571
7.12  带有网络通信模块的服务器的经典结构578
7.12.1  为何要将listenfd设置成非阻塞模式578
7.12.2  基于one thread one loop结构的经典服务器结构584
7.12.3  服务器的性能瓶颈586
第8章  Redis网络通信模块源码分析587
8.1  调试Redis环境与准备587
8.1.1  Redis源码编译与启动587
8.1.2  通信示例与术语约定589
8.2  探究redis-server端的网络通信模块589
8.2.1  监听fd的初始化工作589
8.2.2  接受客户端连接592
8.2.3  epollfd的创建600
8.2.4  监听fd与客户端fd是如何挂载到epollfd上的601
8.2.5  readQueryFromClient函数611
8.2.6  如何处理可写事件613
8.2.7  Redis 6.0多线程网络I/O620
8.2.8  Redis对客户端的管理635
8.2.9  客户端断开流程646
8.2.10  Redis中收发缓冲区的设计653
8.2.11  定时器逻辑659
8.2.12  钩子函数662
8.2.13  redis-server端网络通信模块小结662
8.3  探究redis-cli端的网络通信模型663
8.4  Redis的通信协议格式673
8.4.1  请求命令格式673
8.4.2  应答命令格式674
8.4.3  多命令和流水线677
8.4.4  特殊的redis-cli与内联命令677
8.4.5  Redis对协议数据的解析逻辑678
第9章  服务器开发中的常用模块设计681
9.1  断线自动重连的应用场景和逻辑设计681
9.2  保活机制与心跳包683
9.2.1  TCP keepalive选项683
9.2.2  应用层的心跳包机制设计684
9.2.3  有代理的心跳包机制设计689
9.2.4  带业务数据的心跳包690
9.2.5  心跳包与流量690
9.2.6  心跳包与调试691
9.2.7  心跳包与日志691
9.3  日志模块的设计692
9.3.1  为什么需要日志692
9.3.2  日志系统的技术实现692
9.3.3  在C/C++中输出网络数据包日志716
9.3.4  调试时的日志719
9.3.5  统计程序性能日志719
9.3.6  根据类型将日志写入不同的文件中725
9.3.7  集中式日志服务与分布式日志服务725
9.3.8  从业务层面看在一条日志中应该包含什么内容727
9.3.9  在日志中不要出现敏感信息729
9.3.10  开发过程中的日志递进缩减策略730
9.4  错误码系统的设计730
9.4.1  错误码的作用730
9.4.2  错误码系统设计实践731
9.5  监控端口733

内容摘要
本书从操作系统原理角度讲解进行C++服务器开发所需掌握的技术栈。全书总计9章,第1~2章讲解C++11/14/17新标准中的常用特性、新增类库,以及C++开发者必须熟练掌握的开发调试工具链;第3~6章详细讲解C++服务器开发中的多线程编程技术、网络编程重难点知识、网络故障调试与排查常用工具,以及通信协议的设计思路、技巧;第7~8章详细讲解一个带网络通信组件的高性能服务的基本设计思路和注意事项;第9章进一步补充服务相关的常用模块设计思路和方法。本书秉承的思想是,通过掌握技术原理,可以轻松制造“轮子”,灵活设计出优雅、鲁棒的服务,并快速学习新技术。无论是对于C/C++开发者、计算机专业的学生,还是对于想了解操作系统原理的读者,本书都极具参考价值。

主编推荐
"着重讲解C++服务器开发技术需要掌握的技术栈,内容详尽细致
详解如何掌握C++服务器开发技术,以及如何成为合格的C++开发者
侧重于教会读者“造轮子”的方法,知其然,知其所以然。"

   相关推荐   

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP