第1篇 网络开发基础篇 3
第1章 准备开发环境 3
1.1 Windows Sockets开发概述 3
1.1.1 网络程序开发应用 3
1.1.2 网络程序结构——C/S、B/S 3
1.1.3 网络程序通信基础——网络协议 4
1.1.4 网络程序通信技术——Windows Sockets介绍 4
1.2 连接网络 6
1.2.1 TCP/IP设置 6
1.2.2 TCP/IP是否工作正常 8
1.2.3 系统与网络适配器间的通信 8
1.2.4 默认网关 8
1.2.5 ping其他计算机IP地址 9
1.3 创建应用程序 9
1.3.1 控制台程序 10
1.3.2 MFC应用程序 11
1.4 调试两个应用程序 12
1.4.1 启动两个工程 13
1.4.2 将一个工程加入到另一个工程空间 13
1.5 配置开发环境 14
1.6 小结 15
第2章 TCP/IP简介 16
2.1 开放系统互连参考模型 16
2.2 TCP/IP协议概述 17
2.2.1 TCP/IP模型 17
2.2.2 UDP 18
2.2.3 TCP 18
2.2.4 端口 19
2.3 小结 19
第3章 Windows Sockets基础 20
3.1 Windows Sockets 20
3.1.1 应用程序与Windows Sockets的关系 20
3.1.2 套接字 21
3.2 协议特征 22
3.2.1 面向连接与面向无连接 22
3.2.2 可靠性与次序性 22
3.2.3 面向消息 22
3.2.4 部分消息 23
3.2.5 从容关闭 23
3.2.6 路由选择 24
3.2.7 广播数据 24
3.3 IP定址 24
3.3.1 IP定址 25
3.3.2 字节顺序问题 25
3.4 基本TCP套接字编程 26
3.4.1 WSAStartup()函数 26
3.4.2 socket()函数 28
3.4.3 bind()函数 28
3.4.4 listen()函数 29
3.4.5 accept()函数 29
3.4.6 recv()函数 30
3.4.7 send()函数 31
3.4.8 closesocket()函数 31
3.4.9 shutdown()函数 31
3.4.10 connect()函数 32
3.5 TCP示例程序 32
3.5.1 服务器实现 33
3.5.2 客户端实现 35
3.6 基本UDP套接字编程 37
3.6.1 recvfrom()函数 37
3.6.2 sendto()函数 37
3.7 UDP示例程序 38
3.7.1 服务器实现 38
3.7.2 客户端实现 40
3.8 套接字选项 41
3.8.1 getsockopt()函数 41
3.8.2 setsockopt()函数 42
3.8.3 SOL SOCKET选项级别 43
3.9 小结 44
第2篇 Visual C++网络模式开发篇 47
第4章 阻塞模式开发 47
4.1 套接字的阻塞模式 47
4.1.1 阻塞模式 47
4.1.2 设置套接字的阻塞模式 49
4.1.3 阻塞模式套接字的优势和不足 49
4.2 客户端与服务器相互问候 50
4.3 服务器设计 50
4.3.1 启动 50
4.3.2 接受请求 50
4.3.3 接收数据 51
4.3.4 退出 51
4.3.5 错误提示 51
4.4 服务器实现 51
4.4.1 初始化 52
4.4.2 创建套接字 54
4.4.3 绑定套接字 54
4.4.4 监听 56
4.4.5 接受请求 56
4.4.6 接收数据 56
4.4.7 发送数据 58
4.4.8 退出 59
4.5 客户端设计 59
4.5.1 启动 59
4.5.2 连接服务器 60
4.5.3 接收数据 60
4.5.4 退出 60
4.6 客户端实现 60
4.6.1 初始化 61
4.6.2 创建套接字 61
4.6.3 连接服务器 62
4.6.4 发送数据 63
4.6.5 接收数据 63
4.6.6 退出 64
4.7 小结 64
第5章 非阻塞模式开发 65
5.1 套接字的非阻塞模式 65
5.1.1 非阻塞模式 65
5.1.2 设置套接字的非阻塞模式 65
5.1.3 非阻塞模式套接字的优势和不足 68
5.2 远程算数运算程序 68
5.2.1 需求分析 68
5.2.2 数据包设计 69
5.3 服务器设计 69
5.3.1 多线程设计 69
5.3.2 界面设计 71
5.4 服务器实现 71
5.4.1 主线程 72
5.4.2 接受客户端请求线程 77
5.4.3 客户端类 78
5.4.4 清理资源线程 86
5.5 客户端设计 88
5.5.1 多线程设计 88
5.5.2 界面设计 89
5.6 客户端实现 89
5.6.1 主线程 89
5.6.2 数据发送线程 97
5.6.3 数据接收线程 99
5.7 小结 100
第6章 Select模型开发 101
6.1 套接字Select模型 101
6.1.1 Select模型 101
6.1.2 select()函数 102
6.1.3 Select模型的优势和不足 106
6.2 远程文件下载 107
6.2.1 需求分析 107
6.2.2 数据包设计 107
6.3 服务器设计 108
6.3.1 多线程设计 108
6.3.2 界面设计 109
6.3.3 发送目录结构设计 109
6.4 服务器实现 110
6.4.1 静态类图 110
6.4.2 初始化 113
6.4.3 启动服务 114
6.4.4 接收处理客户端目录和文件长度的请求 116
6.4.5 接收客户端数据 120
6.4.6 向客户端发送目录 123
6.4.7 上传文件 129
6.4.8 退出 133
6.5 客户端设计 133
6.5.1 多线程设计 133
6.5.2 界面设计 134
6.6 客户端实现 136
6.6.1 静态类图 136
6.6.2 初始化 138
6.6.3 连接服务器 139
6.6.4 发送请求接收目录 140
6.6.5 浏览目录 147
6.6.6 下载文件 149
6.6.7 显示下载文件进度 159
6.6.8 退出 160
6.7 小结 160
第7章 WSAAsyncSelect模型开发 161
7.1 套接字WSAAsyncSelect模型分析 161
7.1.1 WSASsyncSelect模型 161
7.1.2 与Select模型比较 162
7.2 套接字WSAAsyncSelect模型实现 162
7.2.1 WSAAsyncSelect()函数 163
7.2.2 窗口例程 163
7.2.3 创建窗口 164
7.3 WSAAsyncSelect模型示例程序 167
7.3.1 声明自定义消息 168
7.3.2 声明窗口例程 168
7.3.3 注册窗口类 169
7.3.4 创建和显示窗口 169
7.3.5 创建套接字 169
7.3.6 注册感兴趣的网络事件 169
7.3.7 绑定套接字 169
7.3.8 开始监听 170
7.3.9 消息循环 170
7.3.10 程序退出 170
7.3.11 窗口例程 170
7.3.12 CClient类 171
7.3.13 管理客户端套接字的链表 171
7.3.14 网络事件消息处理函数 172
7.4 调用WSAAsyncSelect()函数注意问题 173
7.4.1 接收不到网络事件 173
7.4.2 关于accept()函数 173
7.4.3 关于FD READ网络事件 174
7.4.4 如何判断套接字已经关闭 174
7.4.5 发送数据失败 174
7.5 发生网络事件的条件 174
7.5.1 FD_READ事件 174
7.5.2 FD_WRITE事件 174
7.5.3 FD_ACCEPT事件 175
7.5.4 FD_CONNECT事件 175
7.5.5 FD_CLOSE事件 175
7.6 WSAAsyncSelect模型优势和不足 175
7.7 局域网简易聊天程序 176
7.7.1 需求分析 176
7.7.2 用户状态设计 177
7.7.3 数据包类设计 179
7.8 服务器设计 180
7.8.1 界面设计 180
7.8.2 通信层架构设计 182
7.9 服务器实现 182
7.9.1 开发前的准备 182
7.9.2 静态类图 183
7.9.3 启动服务器 186
7.9.4 初始化 191
7.9.5 接受客户端请求 194
7.9.6 接收数据 196
7.9.7 处理数据 203
7.9.8 删除用户 210
7.9.9 用户离线 212
7.9.10 退出 213
7.10 客户端设计 218
7.10.1 界面设计 218
7.10.2 通信层架构设计 220
7.10.3 显示的消息格式设计 220
7.11 客户端实现 220
7.11.1 静态类图 220
7.11.2 初始化 223
7.11.3 接收服务器数据 227
7.11.4 显示离线消息 228
7.11.5 创建聊天窗口 229
7.11.6 在线聊天 231
7.11.7 发送离线消息 234
7.11.8 被动聊天 234
7.11.9 保存聊天记录 235
7.12 小结 236
第8章 WSAEventSelect模型开发 238
8.1 套接字WSAEventSelect模型 238
8.1.1 WSAEventSelect模型 238
8.1.2 与其他模型的比较 238
8.2 套接字WSAEventSelect模型实现 239
8.2.1 WSAEventSelect()函数 239
8.2.2 WSACreateEvent()函数 240
8.2.3 WSAResetEvent()函数 241
8.2.4 WSACloseEvent()函数 241
8.2.5 WSAWaitForMultipleEvents()函数 241
8.2.6 WSAEnumNetworkEvents()函数 242
8.3 WSAEventSelect模型示例程序 244
8.3.1 CClient类 245
8.3.2 管理客户端套接字的链表 245
8.3.3 定义事件对象数组等变量 246
8.3.4 创建套接字 246
8.3.5 为监听套接字注册网络事件 246
8.3.6 开始监听 247
8.3.7 等待网络事件 247
8.3.8 获取发生的网络事件 247
8.3.9 FD_ACCEPT网络事件 248
8.3.10 FD_READ网络事件 249
8.3.11 FD_WRITE网络事件 249
8.3.12 FD_CLOSE网络事件 249
8.3.13 退出 250
8.4 调用WSAEventSelect()函数注意的问题 250
8.4.1 多次调用WSAEventSelect()函数 250
8.4.2 一个套接字不要关联多个事件对象 250
8.4.3 取消为套接字注册的网络事件 251
8.4.4 关于accept()函数 251
8.4.5 关于FD_READ网络事件 251
8.4.6 关于FD_WRITE网络事件 251
8.4.7 关于FD_CLOSE网络事件 251
8.5 WSAEventSelect模型的优势和不足 251
8.6 网络五子棋游戏 252
8.6.1 需求分析 252
8.6.2 游戏规则 253
8.6.3 用户状态设计 253
8.6.4 数据包设计 253
8.7 服务器设计 254
8.7.1 多线程设计 254
8.7.2 界面设计 255
8.8 服务器实现 255
8.8.1 静态类图 255
8.8.2 初始化 260
8.8.3 启动服务 262
8.8.4 服务器运行 264
8.8.5 接收客户端请求 266
8.8.6 接收数据 270
8.8.7 更新用户列表 273
8.8.8 发送用户列表 277
8.8.9 客户端退出 278
8.8.10 服务器退出 278
8.9 客户端设计 279
8.9.1 多线程设计 279
8.9.2 界面设计 279
8.10 客户端实现 281
8.10.1 静态类图 282
8.10.2 创建切分窗口 287
8.10.3 初始化 289
8.10.4 工作线程 294
8.10.5 与服务器通信 295
8.10.6 更新用户列表 299
8.10.7 开始游戏 301
8.10.8 下棋 306
8.10.9 结束游戏 317
8.10.10 退出 318
8.11 小结 319
第9章 重叠I/O模型开发 320
9.1 套接字重叠I/O模型 320
9.1.1 重叠I/O模型 320
9.1.2 与其他模型的比较 321
9.2 套接字重叠I/O模型实现概述 322
9.3 Win32重叠I/O相关技术 322
9.3.1 CreateFile()函数 322
9.3.2 OVERLAPPED结构 323
9.3.3 ReadFile()函数 323
9.3.4 WriteFile()函数 324
9.3.5 GetOverlappedResult()函数 324
9.3.6 示例程序 325
9.4 套接字重叠I/O 327
9.4.1 创建套接字 327
9.4.2 接收数据 327
9.4.3 WSAOVERLAPPED结构 328
9.4.4 WSAWaitForMultipleEvents()函数 329
9.4.5 WSAGetOverlappedResult()函数 329
9.4.6 发送数据 329
9.5 事件通知 330
9.5.1 CClient类 331
9.5.2 管理客户端的链表 332
9.5.3 声明变量和函数 333
9.5.4 套接字的创建、绑定和监听 333
9.5.5 创建服务线程 334
9.5.6 接受客户端连接请求 334
9.5.7 服务线程 335
9.6 完成例程 336
9.6.1 CClient类 337
9.6.2 管理客户端的链表 339
9.6.3 套接字的创建、绑定和监听 339
9.6.4 接受客户端连接请求 339
9.6.5 服务线程 340
9.7 实例开发——网络词典 340
9.7.1 需求分析 341
9.7.2 数据包设计 341
9.7.3 数据库设计 342
9.8 服务器设计 342
9.8.1 多线程设计 342
9.8.2 界面设计 343
9.9 服务器实现 345
9.9.1 开发前的准备 346
9.9.2 静态类图 347
9.9.3 初始化 351
9.9.4 启动服务 358
9.9.5 服务器运行 359
9.9.6 接收数据 361
9.9.7 查询单词含义 364
9.9.8 发送数据 366
9.9.9 查看未知单词 367
9.9.10 数据库操作 370
9.9.11 退出 375
9.10 客户端设计 376
9.10.1 多线程设计 376
9.10.2 界面设计 376
9.11 客户端实现 377
9.11.1 静态类图 377
9.11.2 启动客户端 380
9.11.3 连接服务器 381
9.11.4 工作线程 382
9.11.5 发送数据 385
9.11.6 接收数据 388
9.11.7 显示单词含义 390
9.11.8 退出 391
9.12 小结 391
第10章 完成端口模型开发 392
10.1 套接字完成端口模型 392
10.1.1 利用完成端口接收数据 392
10.1.2 完成端口模型 393
10.1.3 与重叠I/O模型比较 394
10.2 完成端口模型实现 395
10.2.1 创建完成端口对象 395
10.2.2 创建服务线程 396
10.2.3 套接字与完成端口关联 397
10.2.4 发起重叠I/O操作 398
10.2.5 等待重叠I/O操作结果 399
10.2.6 取消异步操作 400
10.2.7 投递完成通知包 400
10.3 完成端口示例程序 401
10.3.1 声明单I/O操作数据结构 402
10.3.2 CClient类 403
10.3.3 管理客户端的链表 404
10.3.4 声明变量和函数 405
10.3.5 创建完成端口 405
10.3.6 创建服务线程 405
10.3.7 套接字的创建、绑定和监听 405
10.3.8 套接字与完成端口关联 406
10.3.9 发起重叠I/O操作 407
10.3.10 等待I/O操作结果 407
10.4 考试系统 409
10.4.1 需求分析 409
10.4.2 数据包设计 410
10.4.3 数据库设计 410
10.5 服务器设计 411
10.5.1 多线程设计 411
10.5.2 界面设计 412
10.6 服务器实现 414
10.6.1 静态类图 414
10.6.2 初始化 419
10.6.3 启动服务 427
10.6.4 接受客户端请求线程 430
10.6.5 服务线程 432
10.6.6 接收客户端数据 433
10.6.7 验证学号 437
10.6.8 发送数据 438
10.6.9 考生交卷 440
10.6.10 跟踪客户端连接状态 442
10.6.11 服务器退出 443
10.7 客户端设计 446
10.8 客户端实现 447
10.8.1 静态类图 448
10.8.2 初始化 450
10.8.3 连接服务器并接收试卷 450
10.8.4 初始化试卷头 454
10.8.5 初始化试卷 455
10.8.6 答卷 459
10.8.7 发送心跳包 460
10.8.8 交卷 460
10.9 小结 462