UNIX网络编程:套接字联网API.pdf

UNIX网络编程:套接字联网API.pdf
 

书籍描述

编辑推荐
《UNIX网络编程(卷1):套接字联网API(第3版)》中顶级网络编程专家Bill Fenner和Andrew M. Rudoff应邀执笔,对W. Richard Stevens的经典作品进行修订。书中吸纳了近几年网络技术的发展,增添了IPv6、SCTP协议和密钥管理套接字等内容,深入讨论了最新的关键标准、实现和技术。
书中的所有示例都是在UNIX系统上测试通过的真实的、可运行的代码,继承了Stevens一直强调的理念:“学习网络编程的最好方法就是下载这些程序,对其进行修改和改进。只有这样实际编写代码才能深入理解有关概念和方法。”读者可以从图灵网站《UNIX网络编程(卷1):套接字联网API(第3版)》网页免费注册下载这些示例的源代码。
《UNIX网络编程(卷1):套接字联网API(第3版)》为UNIX网络编程提供全面的指导,是网络研究和开发人员公认的权威参考书,无论网络编程的初学者还是网络专家都会大受裨益。

媒体推荐
“所有人都非常期待这本书,因为它完美地结合了实践经验、历史视角以及在本领域浸淫多年才能获得的透彻理解。阅读本书是一种享受,我收获颇丰。相信大家定会有同感。”
  ——Sam Leffler,FreeBSD基金会副主席
“这部著作在计算机科学领域里的传奇得以延续,Bill Fenner和Andrew Rudoff居功至伟。”
  ——Art Sedighi
“这套书是学习网络编程最好的书。全世界最最好的,远超群伦。”
  ——S. Devasundaram
“这本书不会让你一夜之间成为专家,但它终究会让你成为专家。”
  ——John Nguyen

作者简介
《UNIX网络编程(卷1):套接字联网API(第3版)》作者:(美国)史蒂文斯(W.Richard Stevens) 是国际知名的UNIX和网络专家,备受赞誉的技术作家。生前著有《TCP/IP详解》(三卷)、《UNIX环境高级编程》和《UNIX网络编程》(两卷),均为不朽的经典著作。
作者芬纳(Bill Fenner),AT&T实验室的主要技术人员,专攻IP多播、网络管理和测量,他是IETF路由的领域主管之一,负责审批作为RFC出版的所有路由相关文档。
作者鲁道夫(Andrew M. Rudoff Sun),公司的资深软件工程师,专攻网络、操作系统内核、文件系统和高可用性软件体系结构。

目录
第一部分 简介和TCP/IP
第1章 简介 2
1.1 概述 2
1.2 一个简单的时间获取客户程序 5
1.3 协议无关性 9
1.4 错误处理:包裹函数 10
1.5 一个简单的时间获取服务器程序 12
1.6 本书中客户/服务器程序示例索引表 14
1.7 OSI模型 16
1.8 BSD网络支持历史 17
1.9 测试用网络及主机 19
1.10 Unix标准 22
1.11 64位体系结构 24
1.12 小结 25
习题 25

第2章 传输层:TCP、UDP和SCTP 27
2.1 概述 27
2.2 总图 27
2.3 用户数据报协议(UDP) 29
2.4 传输控制协议(TCP) 30
.2.5 流控制传输协议(SCTP) 31
2.6 TCP连接的建立和终止 31
2.7 TIME_WAIT状态 37
2.8 SCTP关联的建立和终止 38
2.9 端口号 42
2.10 TCP端口号与并发服务器 43
2.11 缓冲区大小及限制 45
2.12 标准因特网服务 50
2.13 常见因特网应用的协议使用 51
2.14 小结 52
习题 53

第二部分 基本套接字编程
第3章 套接字编程简介 56
3.1 概述 56
3.2 套接字地址结构 56
3.3 值-结果参数 61
3.4 字节排序函数 63
3.5 字节操纵函数 66
3.6 inet_aton、inet_addr和inet_ntoa函数 67
3.7 inet_pton和inet_ntop函数 68
3.8 sock_ntop和相关函数 70
3.9 readn、writen和readline函数 72
3.10 小结 76
习题 76

第4章 基本TCP套接字编程 77
4.1 概述 77
4.2 socket函数 77
4.3 connect函数 80
4.4 bind函数 81
4.5 listen函数 84
4.6 accept函数 88
4.7 fork和exec函数 90
4.8 并发服务器 91
4.9 close函数 93
4.10 getsockname和getpeername函数 94
4.11 小结 96
习题 96

第5章 TCP客户/服务器程序示例 97
5.1 概述 97
5.2 TCP回射服务器程序:main函数 97
5.3 TCP回射服务器程序:str_echo函数 98
5.4 TCP回射客户程序:main函数 99
5.5 TCP回射客户程序:str_cli函数 100
5.6 正常启动 101
5.7 正常终止 102
5.8 POSIX信号处理 103
5.9 处理SIGCHLD信号 106
5.10 wait和waitpid函数 108
5.11 accept返回前连接中止 111
5.12 服务器进程终止 112
5.13 SIGPIPE信号 113
5.14 服务器主机崩溃 114
5.15 服务器主机崩溃后重启 115
5.16 服务器主机关机 116
5.17 TCP程序例子小结 116
5.18 数据格式 117
5.19 小结 120
习题 120

第6章 I/O复用:select和poll函数 122
6.1 概述 122
6.2 I/O模型 122
6.3 select函数 127
6.4 str_cli函数(修订版) 132
6.5 批量输入 133
6.6 shutdown函数 136
6.7 str_cli函数(再修订版) 137
6.8 TCP回射服务器程序(修订版) 138
6.9 pselect函数 142
6.10 poll函数 144
6.11 TCP回射服务器程序(再修订版) 146
6.12 小结 148
习题 149

第7章 套接字选项 150
7.1 概述 150
7.2 getsockopt和setsockopt函数 150
7.3 检查选项是否受支持并获取默认值 152
7.4 套接字状态 156
7.5 通用套接字选项 156
7.6 IPv4套接字选项 168
7.7 ICMPv6套接字选项 169
7.8 IPv6套接字选项 169
7.9 TCP套接字选项 171
7.10 SCTP套接字选项 173
7.11 fcntl函数 182
7.12 小结 184
习题 184

第8章 基本UDP套接字编程 186
8.1 概述 186
8.2 recvfrom和sendto函数 187
8.3 UDP回射服务器程序:main函数 187
8.4 UDP回射服务器程序:dg_echo函数 188
8.5 UDP回射客户程序:main函数 190
8.6 UDP回射客户程序:dg_cli函数 190
8.7 数据报的丢失 191
8.8 验证接收到的响应 191
8.9 服务器进程未运行 193
8.10 UDP程序例子小结 194
8.11 UDP的connect函数 196
8.12 dg_cli函数(修订版) 199
8.13 UDP缺乏流量控制 200
8.14 UDP中的外出接口的确定 203
8.15 使用select函数的TCP和UDP回射服务器程序 204
8.16 小结 206
习题 207

第9章 基本SCTP套接字编程 208
9.1 概述 208
9.2 接口模型 208
9.3 sctp_bindx函数 212
9.4 sctp_connectx函数 213
9.5 sctp_getpaddrs函数 213
9.6 sctp_freepaddrs函数 213
9.7 sctp_getladdrs函数 214
9.8 sctp_freeladdrs函数 214
9.9 sctp_sendmsg函数 214
9.10 sctp_recvmsg函数 215
9.11 sctp_opt_info函数 215
9.12 sctp_peeloff函数 216
9.13 shutdown函数 216
9.14 通知 217
9.15 小结 221
习题 222

第10章 SCTP客户/服务器程序例子 223
10.1 概述 223
10.2 SCTP一到多式流分回射服务器程序:main函数 223
10.3 SCTP一到多式流分回射客户程序:main函数 225
10.4 SCTP流分回射客户程序:sctpstr_cli函数 226
10.5 探究头端阻塞 228
10.6 控制流的数目 233
10.7 控制终结 233
10.8 小结 234
习题 235

第11章 名字与地址转换 236
11.1 概述 236
11.2 域名系统 236
11.3 gethostbyname函数 239
11.4 gethostbyaddr函数 242
11.5 getservbyname和getservbyport函数 242
11.6 getaddrinfo函数 245
11.7 gai_strerror函数 250
11.8 freeaddrinfo函数 251
11.9 getaddrinfo函数:IPv6 251
11.10 getaddrinfo函数:例子 253
11.11 host_serv函数 254
11.12 tcp_connect函数 254
11.13 tcp_listen函数 257
11.14 udp_client函数 261
11.15 udp_connect函数 263
11.16 udp_server函数 264
11.17 getnameinfo函数 266
11.18 可重入函数 267
11.19 gethostbyname_r和gethostbyaddr_r函数 270
11.20 作废的IPv6地址解析函数 271
11.21 其他网络相关信息 272
11.22 小结 273
习题 274

第三部分 高级套接字编程
第12章 IPv4与IPv6的互操作性 278
12.1 概述 278
12.2 IPv4客户与IPv6服务器 278
12.3 IPv6客户与IPv4服务器 281
12.4 IPv6地址测试宏 283
12.5 源代码可移植性 284
12.6 小结 284
习题 285

第13章 守护进程和inetd超级服务器 286
13.1 概述 286
13.2 syslogd守护进程 286
13.3 syslog函数 287
13.4 daemon_init函数 289
13.5 inetd守护进程 293
13.6 daemon_inetd函数 297
13.7 小结 299
习题 299

第14章 高级I/O函数 300
14.1 概述 300
14.2 套接字超时 300
14.3 recv和send函数 305
14.4 readv和writev函数 306
14.5 recvmsg和sendmsg函数 307
14.6 辅助数据 310
14.7 排队的数据量 313
14.8 套接字和标准I/O 313
14.9 高级轮询技术 316
14.10 T/TCP:事务目的TCP 320
14.11 小结 322
习题 323

第15章 Unix域协议 324
15.1 概述 324
15.2 Unix域套接字地址结构 324
15.3 socketpair函数 326
15.4 套接字函数 327
15.5 Unix域字节流客户/服务器程序 327
15.6 Unix域数据报客户/服务器程序 329
15.7 描述符传递 330
15.8 接收发送者的凭证 337
15.9 小结 340
习题 340

第16章 非阻塞式I/O 341
16.1 概述 341
16.2 非阻塞读和写:str_cli函数(修订版) 342
16.3 非阻塞connect 351
16.4 非阻塞connect:时间获取客户程序 352
16.5 非阻塞connect:Web客户程序 354
16.6 非阻塞accept 362
16.7 小结 363
习题 363

第17章 ioctl操作 365
17.1 概述 365
17.2 ioctl函数 365
17.3 套接字操作 366
17.4 文件操作 367
17.5 接口配置 367
17.6 get_ifi_info函数 369
17.7 接口操作 378
17.8 ARP高速缓存操作 378
17.9 路由表操作 380
17.10 小结 381
习题 381

第18章 路由套接字 382
18.1 概述 382
18.2 数据链路套接字地址结构 382
18.3 读和写 383
18.4 sysctl操作 390
18.5 get_ifi_info函数 394
18.6 接口名字和索引函数 397
18.7 小结 401
习题 401

第19章 密钥管理套接字 402
19.1 概述 402
19.2 读和写 403
19.3 倾泻安全关联数据库 404
19.4 创建静态安全关联 407
19.5 动态维护安全关联 412
19.6 小结 415
习题 416

第20章 广播 417
20.1 概述 417
20.2 广播地址 418
20.3 单播和广播的比较 419
20.4 使用广播的dg_cli函数 422
20.5 竞争状态 424
20.6 小结 431
习题 432

第21章 多播 433
21.1 概述 433
21.2 多播地址 433
21.3 局域网上多播和广播的比较 436
21.4 广域网上的多播 438
21.5 源特定多播 440
21.6 多播套接字选项 441
21.7 mcast_join和相关函数 445
21.8 使用多播的dg_cli函数 450
21.9 接收IP多播基础设施会话声明 451
21.10 发送和接收 454
21.11 SNTP:简单网络时间协议 457
21.12 小结 461
习题 461

第22章 高级UDP套接字编程 462
22.1 概述 462
22.2 接收标志、目的IP地址和接口索引 462
22.3 数据报截断 467
22.4 何时用UDP代替TCP 467
22.5 给UDP应用增加可靠性 469
22.6 捆绑接口地址 478
22.7 并发UDP服务器 482
22.8 IPv6分组信息 483
22.9 IPv6路径MTU控制 486
22.10 小结 487
习题 488

第23章 高级SCTP套接字编程 489
23.1 概述 489
23.2 自动关闭的一到多式服务器程序 489
23.3 部分递送 490
23.4 通知 492
23.5 无序的数据 495
23.6 捆绑地址子集 496
23.7 确定对端和本端地址信息 497
23.8 给定IP地址找出关联ID 500
23.9 心搏和地址不可达 501
23.10 关联剥离 502
23.11 定时控制 503
23.12 何时改用SCTP代替TCP 505
23.13 小结 506
习题 506

第24章 带外数据 507
24.1 概述 507
24.2 TCP带外数据 507
24.3 sockatmark函数 513
24.4 TCP带外数据小结 519
24.5 客户/服务器心搏函数 520
24.6 小结 524
习题 524

第25章 信号驱动式I/O 525
25.1 概述 525
25.2 套接字的信号驱动式I/O 525
25.3 使用SIGIO的UDP回射服务器程序 527
25.4 小结 532
习题 533

第26章 线程 534
26.1 概述 534
26.2 基本线程函数:创建和终止 535
26.3 使用线程的str_cli函数 537
26.4 使用线程的TCP回射服务器程序 538
26.5 线程特定数据 542
26.6 Web客户与同时连接 549
26.7 互斥锁 552
26.8 条件变量 555
26.9 Web客户与同时连接(续) 558
26.10 小结 560
习题 560

第27章 IP选项 561
27.1 概述 561
27.2 IPv4选项 561
27.3 IPv4源路径选项 562
27.4 IPv6扩展首部 569
27.5 IPv6步跳选项和目的地选项 569
27.6 IPv6路由首部 573
27.7 IPv6粘附选项 577
27.8 历史性IPv6高级API 578
27.9 小结 579
习题 579

第28章 原始套接字 580
28.1 概述 580
28.2 原始套接字创建 580
28.3 原始套接字输出 581
28.4 原始套接字输入 582
28.5 ping程序 584
28.6 traceroute程序 596
28.7 一个ICMP消息守护程序 608
28.8 小结 622
习题 622

第29章 数据链路访问 623
29.1 概述 623
29.2 BPF:BSD分组过滤器 623
29.3 DLPI:数据链路提供者接口 625
29.4 Linux:SOCK_PACKET和 PFPACKET 626
29.5 libpcap:分组捕获函数库 627
29.6 libnet:分组构造与输出函数库 627
29.7 检查UDP的校验和字段 628
29.8 小结 645
习题 645

第30章 客户/服务器程序设计范式 646
30.1 概述 646
30.2 TCP客户程序设计范式 648
30.3 TCP测试用客户程序 649
30.4 TCP迭代服务器程序 650
30.5 TCP并发服务器程序,每个客户一个子进程 650
30.6 TCP预先派生子进程服务器程序,accept无上锁保护 653
30.7 TCP预先派生子进程服务器程序,accept使用文件上锁保护 659
30.8 TCP预先派生子进程服务器程序,accept使用线程上锁保护 662
30.9 TCP预先派生子进程服务器程序,传递描述符 663
30.10 TCP并发服务器程序,每个客户一个线程 667
30.11 TCP预先创建线程服务器程序,每个线程各自accept 669
30.12 TCP预先创建线程服务器程序,主线程统一accept 671
30.13 小结 673
习题 674

第31章 流 675
31.1 概述 675
31.2 概貌 675
31.3 getmsg和putmsg函数 678
31.4 getpmsg和putpmsg函数 679
31.5 ioctl函数 680
31.6 TPI:传输提供者接口 680
31.7 小结 689
习题 689

附录A IPv4、IPv6、ICMPv4和ICMPv6 690
附录B 虚拟网络 704
附录C 调试技术 708
附录D 杂凑的源代码 714
附录E 精选习题答案 726
参考文献 756
索引 763

序言
概述
本书面向的读者是那些希望自己编写的程序能使用称为套接字(socket)的API进行彼此通信的人。有些读者可能已经非常熟悉套接字了,因为这个模型几乎已经成了网络编程的同义词,但有些读者可能仍需要从头开始学习。本书想达到的目标是向大家提供网络编程指导。这些内容不仅适用于专业人士,也适用于初学者;不仅适用于维护已有代码,也适用于开发新的网络应用程序;此外,还适用于那些只是想了解一下自己系统中网络组件的工作原理的人。
书中的所有示例都是在Unix系统上测试通过的真实的、可运行的代码。但是,考虑到许多非Unix的操作系统也支持套接字API,因而我们选取的示例与所讲述的一般性概念,在很大程度上是与操作系统无关的。几乎每种操作系统都提供了大量的网络应用程序,如网页浏览器、电子邮件客户端、文件共享服务器等。我们按常规的划分方法把这些应用程序分为客户程序和服务器程序,并在书中多次编写了相应的小型示例。
面向Unix介绍网络编程自然免不了要介绍Unix本身和TCP/IP的相关背景知识。需要更详尽的背景知识时,我们会指引读者查阅其他书籍。本书中经常提到以下4本书,我们将其简记如下:
APUE:Advanced Programming in the UNIX Environment [Stevens 1992];
TCPv1:TCP/IP Illustrated, Volume 1 [Stevens 1994];
TCPv2:TCP/IP Illustrated, Volume 2 [Wright and Stevens 1995];
TCPv3:TCP/IP Illustrated, Volume 3 [Stevens 1996]。
其中TCPv2包含了与本书内容密切相关的细节,它描述并给出了套接字API中网络编程函数(socket、bind、connect等)的真实4.4BSD实现。如果已经理解某个特性的实现,那么在应用程序中使用该特性就更有意义了。
与第2版的区别
从20世纪80年代开始,套接字就差不多是现在这个样子了。时至今日,套接字仍然是网络API的首选,其最初的设计的确值得称道。因此,当读者发现我们对出版于1998年的第2版又做了不少改动时,可能会觉得惊讶。本书中所做的改动归纳如下。
新版本包含了IPv6的最新信息。在第2版出版时,IPv6尚处于草案阶段,这些年来已经有所发展。
更新了全部函数和示例的描述,以反映最新的POSIX规范(POSIX 1003.1-2001),即Single Unix Specification Version 3。
删去了X/Open传输接口(XTI)的内容。这个API已经不常用了,连最新的POSIX 规范也不再提到。
删去了事务TCP协议(T/TCP)的内容。
新增了三章用于描述一种相对较新的传输协议——SCTP。这个可靠的面向消息的协议能够在两个端点之间提供多个流,并为多归属技术提供传输层支持。该协议最初是为了在因特网上传输电话信号而设计的,但它的一些特性可以用于许多应用。

文摘
插图:

UNIX网络编程:套接字联网API

我们将在本章较深入地讨论SCTP,查看SCTP提供的更多特性和套接字选项。我们将讨论多个论题,包括故障检测的控制、无序的数据以及通知。本章通章提供了多个代码例子,以展示如何使用SCTP的某些高级特性。
SCTP是一个面向消息的协议,递送给用户的是部分的或完整的消息。部分消息的递送前提是应用进程选择向对端发送大消息(譬如大于套接字缓冲区一半大小)。部分消息被递送给应用进程之后,多个部分消息组合成单个完整消息并不由SCTP负责。在应用进程看来,一个消息既可以由单个输入操作接收,也可以由若干个相继的输入操作接收。我们将通过一个作为例子的函数说明处理这种部分递送机制的一个方法。
SCTP服务器程序既可以迭代运行,也可以并发运行,这取决于应用程序开发人员选取的套接字式样。SCTP还提供了从一到多式套接字抽取某个关联并使其成为一到一式套接字的方法。本方法允许构造既可迭代运行又可并发运行的服务器程序。
回顾我们在第10章中编写的服务器程序,它不保持任何关联状态,因为它依赖客户程序关闭关联。依赖客户关闭关联存在这样的弱点:要是客户打开一个关联后从不发送任何数据,将发生什么?服务器不得不将资源分配给从不使用这些资源的客户。懒惰的客户会无意中造成对于SCTP实现的拒绝服务攻击。

内容简介
《UNIX网络编程(卷1):套接字联网API(第3版)》全面深入地介绍了如何使用套接字API进行网络编程。全书不但介绍了基本编程内容,还涵盖了与套接字编程相关的高级主题,对于客户/服务器程序的各种设计方法也作了完整的探讨,最后还深入分析了流这种设备驱动机制。
《UNIX网络编程(卷1):套接字联网API(第3版)》内容详尽且具权威性,几乎每章都提供精选的习题,并提供了部分习题的答案,是网络研究和开发人员理想的参考书。

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多