Windows Sockets网络编程 内容简介:
《Windows Sockets网络编程》分为三部分:第一部分(第1~6章),提供了翔实的背景知识和框架方面的概念,借助于此框架,读者可理解WinSock的具体细节,包括Windows Sockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;第二部分(第7~12章),以FTP客户端实例为基础介绍了函数实例库,还介绍了客户端程序、服务器程序和DLL中间构件及它们的相应函数,并涵盖socket命令和选项及移植BSD Sockets相关事项等;第三部分(第13~17章),介绍了应用程序调试技术和工具,针对应用编程中的陷阱的建议和措施,WinSock API的多种操作系统平台,WinSock规范的可选功能和WinSock规范2.0中的所有新功能。另外,《Windows Sockets网络编程》还提供了4个极具参考价值的附录。
编辑推荐
《Windows Sockets网络编程》是Windows Sockets网络编程领域公认的经典著作,由Windows Sockets 2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对Windows Sockets规范进行了深刻地解读,系统讲解了Windows Sockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是学习Windows Sockets网络编程不可多得的参考书。
作者简介
作者:(美国)奎因(Bob Quinn) (美国)舒特(Dave Shute) 译者:徐磊 腾婧 张莹 何慧
奎因(Bob Quinn),WinSock 2.0规范解释小组的负责人,Windows Sockets技术的开拓者之一,曾为WinSock规范1.1版本做出重要贡献,从事TCP/IP网络开发多年,经验颇丰。
舒特(Dave Shute),Windows Sockets技术的先驱者和布道者,WinSock问世之初便与Bob一起服务于著名的FTP软件公司,对WinSock技术和TCP/IP等网络技术都有非常透彻的研究,实践经验极为丰富。
Windows Sockets网络编程 目录:
译者序序
前言
第1章 Windows Sockets概述1
1.1 什么是Windows Sockets2
1.2 Windows Sockets的发展历史3
1.3 Windows Sockets的优势4
1.3.1 Windows Sockets是一个开放的标准4
1.3.2 Windows Sockets提供源代码可移植性4
1.3.3 Windows Sockets支持动态链接5
1.3.4 Windows Sockets的优点6
1.4 Windows Sockets的前景7
1.5 结论7
第2章 Windows Sockets的概念9
2.1 OSI网络模型9
2.2 WinSock网络模型11
2.2.1 信息与数据12
2.2.2 应用协议12
2.3 WinSock中的OSI层次12
2.3.1 应用层13
2.3.2 表示层14
2.3.3 会话层14
2.3.4 传输层15
2.3.5 网络层16
2.3.6 数据链路层17
2.3.7 物理层17
2.4 模块化的层次框18
2.5 服务和协议19
2.6 协议和API21
第3章 TCP/IP协议服务23
3.1 什么是TCP/IP23
3.2 TCP/IP的发展历史25
3.3 传输服务26
3.3.1 无连接的服务:UDP26
3.3.2 面向连接的服务:TCP28
3.3.3 传输协议的选择:UDP与TCP的对比29
3.4 网络服务30
3.4.1 IP服务30
3.4.2 ICMP服务31
3.5 支持协议和服务32
3.5.1 域名服务32
3.5.2 地址解析协议33
3.5.3 其他支持协议33
3.6 TCP/IP的发展前景34
第4章 网络应用程序工作机制35
4.1 客户端-服务器模型35
4.2 网络程序概览37
4.3 socket的打开37
4.4 socket的命名39
4.4.1 sockaddr结构40
4.4.2 sockaddr_in结构40
4.4.3 端口号41
4.4.4 本地IP地址41
4.4.5 什么是socket名称42
4.4.6 客户端socket名称是可选的42
4.5 与另一个socket建立关联43
4.5.1 服务器如何准备建立关联44
4.5.2 客户端如何发起一个关联45
4.5.3 服务器如何完成一个关联47
4.6 socket之间的发送与接收48
4.6.1 在“已连接的”socket上发送数据48
4.6.2 在“无连接的”socket上发送数据49
4.6.3 接收数据50
4.6.4 socket解复用器中的关联51
4.7 socket的关闭52
4.7.1 closesocket()52
4.7.2 shutdown()53
4.8 客户端和服务器概览54
第5章 操作模式56
5.1 什么是操作模式57
5.1.1 不挂机,等待:阻塞57
5.1.2 挂机后再拨:非阻塞57
5.1.3 请求对方回拨:异步58
5.2 阻塞模式58
5.2.1 阻塞socket58
5.2.2 阻塞函数59
5.2.3 伪阻塞的问题59
5.2.4 阻塞钩子函数60
5.2.5 阻塞情境61
5.2.6 撤销阻塞操作62
5.2.7 阻塞操作中的超时64
5.2.8 无最少接收限制值65
5.2.9 代码示例65
5.3 非阻塞模式67
5.3.1 怎样使socket成为非阻塞的68
5.3.2 成功与失败不是绝对的68
5.3.3 探询而非阻塞69
5.3.4 显式地避让69
5.3.5 代码示例70
5.4 异步模式72
5.4.1 认识异步函数73
5.4.2 撤销异步操作74
5.4.3 代码示例74
5.4.4 AU_Time应用76
5.5 性能比较85
5.6 平台比较86
5.7 真正的阻塞86
5.7.1 线程化的应用程序86
5.7.2 其他适用性说明87
第6章 socket状态88
6.1 什么是socket状态88
6.1.1 数据报socket的状态89
6.1.2 流socket的状态90
6.2 socket状态的检测方法91
6.2.1 根据函数调用的成功或失败检测92
6.2.2 同步检测93
6.2.3 异步检测93
6.3 WSAAsyncSelect()93
6.3.1 WSAAsyncSelect()的工作原理94
6.3.2 什么是WSAAsyncSelect()事件96
6.3.3 避免机会丢失的窗口96
6.3.4 什么是重使能函数97
6.3.5 什么是通知消息98
6.3.6 为函数失败做好准备98
6.3.7 在响应时设置循环99
6.3.8 撤销异步通知99
6.3.9 事件描述99
6.3.10 AS_Echo应用程序102
6.4 select()115
6.4.1 怎样使用select()116
6.4.2 select()的宏117
6.4.3 select()的输入参数118
6.4.4 不要把select()作为定时器120
6.4.5 注意0超时120
6.4.6 代码示例120
6.5 查看数据122
6.5.1 ioctlsocket()FIONREAD命令122
6.5.2 带有MSG_PEEK标志的recv()122
6.6 带外数据123
6.6.1 TCP的局限124
6.6.2 ioctlsocket()函数和SIOCATMARK命令125
6.6.3 代码示例125
6.7 监听状态126
第7章 应用程序和函数实例库127
7.1 FTP客户端实例127
7.1.1 文件传输协议概述128
7.1.2 FTP有限状态机130
7.1.3 AC_FTP应用程序132
7.1.4 操作中的AC_FTP168
7.2 函数实例库169
7.2.1 CenterWnd()170
7.2.2 CloseConn()171
7.2.3 CreateLclFile()172
7.2.4 Dlg_About()173
7.2.5 GetAddr()174
7.2.6 GetBuf()175
7.2.7 GetHostID()176
7.2.8 GetLclDir()177
7.2.9 GetPort()179
7.2.10 WSAErrStr()179
7.2.11 WSAperror()180
7.3 WinSockx.h182
7.3.1 Globals.c183
7.3.2 WSA_Xtra.h184
第8章 主机名称与主机地址187
8.1 主机名称与主机地址解析187
8.1.1 hostent结构188
8.1.2 主机名称解析189
8.1.3 地址解析195
8.2 主机表、域名系统和网络信息服务198
8.2.1 主机表198
8.2.2 域名系统198
8.2.3 网络信息服务199
8.3 本地主机信息200
8.4 网络地址与格式化201
8.4.1 in_addr结构201
8.4.2 inet_addr()202
8.4.3 inet_ntoa()203
8.5 协议族与地址族204
第9章 socket信息与控制205
9.1 socket控制205
9.1.1 FIONBIO206
9.1.2 FIONREAD207
9.1.3 SIOCATMARK208
9.1.4 其他控制命令208
9.2 socket选项209
9.2.1 getsockopt()与setsockopt()209
9.2.2 SO_ACCEPTCONN211
9.2.3 SO_BROADCAST211
9.2.4 SO_DEBUG212
9.2.5 SO_DONTLINGER213
9.2.6 SO_DONTROUTE213
9.2.7 SO_ERROR214
9.2.8 SO_KEEPALIVE214
9.2.9 SO_LINGER216
9.2.10 SO_OOBINLINE218
9.2.11 SO_RCVBUF与SO_SNDBUF218
9.2.12 SO_REUSEADDR219
9.2.13 SO_TYPE219
9.2.14 TCP_NODELAY220
9.2.15 不支持的选项221
9.2.16 未来会使用的选项222
9.3 阻塞钩子222
9.3.1 WSASetBlockingHook()222
9.3.2 WSAUnhookBlockingHook()223
9.3.3 阻塞钩子函数223
9.3.4 阻塞状态224
9.4 socket 名称224
9.4.1 getsockname()225
9.4.2 getpeername()226
第10章 支持例程228
10.1 启动与清除228
10.1.1 WSAStartup()228
10.1.2 WSACleanup()234
10.2 字节顺序234
10.3 服务名称与端口号236
10.3.1 servent结构236
10.3.2 服务解析237
10.3.3 端口解析240
10.3.4 服务数据库241
10.4 协议名称与协议号242
10.4.1 protoent结构243
10.4.2 协议名称解析243
10.4.3 协议号解析247
10.4.4 协议数据库247
10.5 报错248
10.5.1 WSAGetLastError()248
10.5.2 WSASetLastError()249
10.5.3 错误文本显示249
第11章 WinSock上的DLL250
11.1 创建一个新的API250
11.1.1 仿真的API251
11.1.2 应用协议API252
11.1.3 封装的WinSock API252
11.2 DLL的问题253
11.2.1 重入254
11.2.2 任务管理255
11.2.3 与WinSock DLL的链接256
11.3 DLL实例256
11.3.1 WSASimpl应用程序257
11.3.2 WSASimpl DLL258
第12章 移植BSD Sockets272
12.1 Windows Sockets与Berkeley Sockets的差异272
12.1.1 socket不是文件句柄273
12.1.2 signal()不可用274
12.1.3 域名不可用275
12.1.4 地址信息和操作不可用275
12.1.5 syslog()不可用276
12.1.6 变量errno不可用276
12.1.7 perror()和strerror()不可用276
12.1.8 数据库文件操作不可用276
12.1.9 bcmp()、bcopy()和bzero()不可用276
12.1.10 本地IPC不可用277
12.1.11 OOB API不同277
12.1.12 setsockopt()SO_DEBUG是可选的277
12.2 16位Windows的局限性277
12.2.1 16位Windows不清理现场277
12.2.2 16位Windows是非抢占式的278
12.2.3 16位Windows文件系统不安全278
12.2.4 16位Windows使用分段寻址279
12.2.5 fork()不可用279
12.3 移植Berkeley Sockets的其他事项279
12.3.1 包含文件279
12.3.2 socket域279
12.3.3 socket类型279
12.3.4 socket句柄280
12.3.5 错误值280
12.4 函数列表280
第13章 调试284
13.1 问题类型284
13.1.1 安装问题285
13.1.2 网络问题285
13.1.3 程序问题285
13.1.4 WinSock DLL问题285
13.2 故障表现及其定位286
13.3 问题评估286
13.4 安装调试287
13.5 网络调试287
13.5.1 通用网络调试288
13.5.2 主机解析调试289
13.6 应用程序调试289
13.7 调试工具290
13.7.1 网络调试工具290
13.7.2 应用程序调试工具295
13.7.3 WinSock符合性和性能测试工具297
13.7.4 其他调试工具297
第14章 该做和不该做的299
14.1 特征化应用程序299
14.2 应用程序数据流300
14.2.1 增大缓存301
14.2.2 MTU的考虑301
14.2.3 健壮性原则302
14.2.4 避免查看303
14.2.5 先接收后发送303
14.3 流算法303
14.3.1 发送结构化数据303
14.3.2 发送交互数据305
14.3.3 检测无效连接306
14.3.4 验证数据传输306
14.4 数据报算法307
14.4.1 实现超时机制308
14.4.2 数据报排序308
14.4.3 有节制地发送数据308
14.4.4 同步发送方和接收方309
14.5 好消息准则309
14.5.1 检查返回值309
14.5.2 检测部分成功310
14.5.3 准备应对任何阶段出现的任何错误310
14.5.4 检测非致命错误310
14.5.5 恰当地处理错误311
14.5.6 对用户透明311
14.5.7 留好出口311
14.5.8 不忽视任何警告信息311
14.6 常见陷阱和缺陷312
14.6.1 打开和命名socket312
14.6.2 建立连接313
14.6.3 监听和同意建立连接313
14.6.4 发送和接收314
14.6.5 关闭socket315
14.6.6 使用主机名称和地址316
14.6.7 使用WSAAsyncSelect()函数316
14.6.8 使用阻塞socket317
14.6.9 退出某个应用程序319
14.6.10 其他注意事项320
第15章 系统平台322
15.1 WOSA网络模型322
15.2 32位WinSock323
15.2.1 Windows 95324
15.2.2 交叉执行324
15.2.3 32位WinSock特征324
15.2.4 32位操作系统优势328
15.3 其他系统平台329
第16章 可选特性330
16.1 自相矛盾的可选标准330
16.2 应该使用可选特性吗331
16.3 原始socket332
16.3.1 ICMP ping应用332
16.3.2 IP_TTL路径跟踪337
16.4 多播338
16.4.1 为何使用多播338
16.4.2 多播API339
16.4.3 多播机制341
16.5 环回接口345
16.6 共享socket345
16.7 可选项346
16.8 socket作为文件句柄346
16.9 在任何时候都准备好应对任何错误347
16.10 其他可选特性347
第17章 WinSock 2348
17.1 你需要WinSock 2吗349
17.2 特性概述349
17.3 多协议支持351
17.3.1 WinSock 2架构351
17.3.2 协议独立352
17.3.3 名称空间独立353
17.4 重叠I/O356
17.5 分散和聚合358
17.6 服务质量358
17.7 socket组360
17.8 多点和多播361
17.9 有条件的接受362
17.10 连接和断开数据363
17.11 socket共享364
17.12 协议相关的附加功能364
17.12.1 WSAIoctl()365
17.12.2 get/setsockopt()365
附录A TCP/IP协议首部366
A.1 TCP/IP报文中的分层366
A.2 ARP首部367
A.3 IP首部368
A.4 ICMP首部369
A.5 IGMP首部370
A.6 TCP首部371
A.7 UDP首部372
A.8 对话示例373
附录B 快速参考380
B.1 结构380
B.2 函数384
B.3 宏391
附录C 错误信息参考398
C.1 获取错误值的位置398
C.2 可能出现的错误399
C.3 用户可以解决的错误400
C.4 详细的错误描述400
C.5 按数值排序的错误代码表419
附录D 用户必备421
D.1 重要文件421
D.2 编译与链接机制422
D.3 各种WinSock的使用423
D.4 各种编程语言的使用424