概述
本书面向的读者是那些希望自己编写的程序能使用称为套接字(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。这个可靠的面向消息的协议能够在两个端点之间提供多个流,并为多归属技术提供传输层支持。该协议最初是为了在因特网上传输电话信号而设计的,但它的一些特性可以用于许多应用。
·新增一章描述密钥管理套接字,该套接字可用于网际协议安全(1Psec)和其他网络安全服务。
·第2版中使用的机器~Unix变体都按最新版本更新,示例也根据机器的特性做了修改。许多情况下,修改示例是因为操作系统厂商修正了程序缺陷或者新增了特性。但读者可以想见,新的缺陷总能不时地被发现。本书中用于测试示例的机器如下:
·运行MacOS/X10.2.6的Apple PowerPC;
.·运行HP-UX lli的HPPA-RISC;
·运行AIX 5.1的IBM PowerPC,
·运行FreeBSD4.8的Intelx 861
·运行Linux2.4.7的Intelx 861
·运行FreeBSD 5.1的Sun SPARC,
·运行Solaris 9的Sun SP ARC。
这些机器的具体用法见图1-16。
本系列的第2卷(《UNIX网络编程 卷2:进程间通信》)基于本卷的内容进一步讨论了消启传递、同步、共享内存及远程过程调用。..
如何使用本书
本书既可以作为网络编程的教程,也可以作为有经验的程序员的参考书。用作网络编程的教程或入门级教材时,重点应放在第二部分(第3章至第11章),然后可以看看其他感兴趣的主题。第二部分包含了TCP和UDP的基本套接字函数,以及SCTP、I/O多路复用、套接宇选项和基本名字与地址的转换。所有读者都应该阅读第1章,尤其是1.4节,介绍了一些贯穿全书的包装函数。读者可以根据自身的知识背景,选读第2章,或许还有附录A。第三部分的多数章节可以彼此独立地进行阅读。
为了方便读者把本书作为参考书,本书提供了完整的全文索引,并在最后几页总结了每个函数和结构的详细描述在正文中的哪里可以找到。为了给不按顺序阅读本书的读者提供方便,我们在全书中为相关主题提供了大量的交叉引用。
源代码与勘误
书中所有示例的源代码可以从www.unpbook.com获得。学习网络编程的最好方法就是下载这些程序,对其进行修改和改进。只有这样实际编写代码才能深入理解有关概念和方法。每章末尾提供了大量的习题,大部分在附录E中给出答案。
本书的最新勘误表也可以在上述网站获取。
致谢
本书第1版和第2版由W.Richard Stevens独立撰写,他不幸于1999年9月1日去世。Richard的著作体现了非常高的水准,,被公认为是精炼、详实且极具可读性的艺术作品。在撰写这一修订版的过程中,我们力图保持Richard之前版本的高质量和全面性,这方面的任何不足都完全是新作者的过错。
任何作者的著作离不开家人与朋友的支持。BillFenner在此感谢爱妻Peggy(沙滩1/4英里赛冠军)与好友Christopher Boyd在本书撰写过程中承担了全部的家务,还要感谢朋友Jerry Winner,他的激励是无价的。同样地,Andy Rudoff要特别感谢他的妻子Ellen和两个女儿Jo、Katie自始至终的理解与鼓励。没有你们的支持,我们不可能完成本书。
思科公司的Randall Stewart提供了许多SCTP的材料,非常感谢他的巨大贡献。如果缺少了他的工作,本书就不能涵盖这一新颖而有趣的主题。
本书的审稿人给出了宝贵的反馈意见。他们发现了一些错误,指出了一些需要更多解释的地方,并对文字和代码示例提出了一些改进建议。作者在这里对如下审稿人表示感谢:James Carlson、Wu—Chang Feng、Rick Jones、Brian Kernighan、Sam Leffler、John McCann、Craig Metz、IanLanceTaylor、DavidSchwartz和GaryWright。
许多个人及其单位为本书中一些示例的测试提供了帮助,他们义务向我们出借系统、软件或为我们提供系统访问权限。
·IBM奥斯汀实验室的JessieHaug提供了AIX系统和编译器。
·惠普公司的Rick Jones和William Gilliam为我们提供了运行HP-UX的多个系统的访问权限。
与Addison Wesley出版社的员工合作非常愉快,他们是Noreen Regina、Kathleen Caren、Dan DePasquale和Anthony Gemellaro。要特别感谢本书的编辑Mary Franz。
为了延续Rich Stevens的风格(不过该风格与流行的风格相反),我们用James Clark编写的优秀的Groff包为本书排版,用gpic程序绘制插图(其中用到了许多由Gary Wright编写的宏), 用gtbl程序生成了表格,我们为全书添加了索引,并设计了最终的版式。录入源代码时用到了Dave Hanson的loom程序和Gary Wright写的一些脚本。在生成最终索引的过程中,还用到了Jon Bentley与Brian Kernighan编写的一组awk脚本。
欢迎读者以电子邮件的方式反馈意见、提出建议或订正错误。...
Bill Fenner
加利福尼亚州伍德赛德市
Andrew M·Rudoff
科罗拉多州博尔德市
2003年10月
authors@unpbook.com
http://www.unpbook.com