UNIX 网络编程,第一卷,第二版

作者:David Bausum
UNIX Network Programming, Volume 1, Second Edition
  • 作者:W. Richard Stevens

  • 出版社:Prentice Hall

  • 电子邮件:sales@prenhall.com

  • 网址:http://www.phptr.com/

  • 价格:59 美元

  • ISBN:0-13-490012-X

  • 评论者:David Bausum

1990 年,我偶然看到了一本听起来很有趣的书评。我将作者的名字和书名记在脑海中,几个月后,当我在一家大型书店时,我购买了帕特里克·奥布莱恩的 怒海争锋。在读了十几页之后,我就被迷住了。在随后的几年里,我欣赏了全部 18 卷关于马图林和奥布里在拿破仑战争期间的冒险经历的系列小说。这个故事的重点是,当我找到一位我喜欢的作家时,我会尽可能多地阅读他的书。我发现同样的方法也适用于技术书籍。

LJ 第 42 期中,我描述了我是如何发现 W. Richard Stevens 的 UNIX 环境高级编程 的。结合该评论中描述的项目,我需要学习一些关于 UNIX 网络编程的知识。巧合的是,Stevens 的第一本书名为 UNIX 网络编程。 1996 年末,我毫不犹豫地订购了这本书,尽管它已经出版六年,可能已经过时了。由于我不太理解的原因(但归咎于我自己的不足),UNP 和我从来没有像 APUE 和我那样产生共鸣。即便如此,当我在 1997 年秋天得知 UNP 第二版即将发布时,我一有空就订购了一本。

一般来说,我对新版本持谨慎态度。很多时候,这本书只是有一个新的序言,一个新的封面(上面用大字写着“新”或“改进”字样),一个新的版权日期,一些表面的材料改组,仅此而已。一些出版商和作者专门从事这种游戏。但这本书并非如此。完整的书名暗示了新版本是真实的。(事实上,第二版计划出版三卷。)粗略地浏览一下目录就证实这是一本全新的书。在使用了几天之后,一些东西发生了变化,UNIX 网络编程的基础知识对我来说就位了。

我喜欢使用 Stevens 的书,因为他制作的书籍很精美。这里可操作的词是“制作精美”。第二个词很重要,因为一本精美的书——一本组织良好,页面包含文本(解释手头的主题)、图表(显示关系)、表格(总结或详细说明特定项目)和代码的平衡呈现的书——使初学者更容易完成新材料的学习之旅。第一个词很重要,因为一本精美的书不会凭空出现。它是以与中世纪艺术品相同的方式制作的:由一位花费数年时间掌握一个领域,然后将这种掌握应用于各种项目的个人制作的。 Stevens 使用的工具之一是 troff。如果您对设计和布局感兴趣,您可能会从 Stevens 网站上关于排版和 troff 资源的部分中获益。为了避免读者认为我对此言过其实,请允许我指出,我目前正在学习另一个领域(最好不具名)的几本书。不幸的是,没有一本像 Stevens 的书那样组织良好(在上面描述的意义上是精美的)。因此,我发现每一本都难以使用。

新书完全重写了 UNP 关于 Berkeley 套接字和 System V 的 TLI 的章节。尽管它超过 1000 页,但它没有冗余内容,也没有(不必要地)重复 Stevens 早期书籍中的材料。书中涵盖的通用(非网络)编程内容很少。必要时会引用 APUE。同样,Stevens 引用了 TCP/IP 系列,而不是重复其中涵盖的材料。此外,他还设法删减了第一版 UNP 中约占 10% 的关于网络的泛泛之谈。例如,在新书的第 6 页,Stevens 展示了一个可工作的客户端程序的代码,在第 13 页,他展示了配套的服务器的代码。当客户端连接时,服务器获取时间并将其发送给客户端,客户端打印出来并退出。结果是微不足道的(就像经典的“hello world”程序一样),但它提供了一个可工作的客户端-服务器程序,几乎在本书的前十几页中就完成了。

这本新书将可工作的、可移植的、真实世界的、带注释的代码与文本、图表和表格相结合,以记录套接字(和 XTI)API。本书讨论了 50 多个程序和 100 个函数。

可工作的代码意味着您可以从 Stevens 的主页 (http://www.kohala.com/~rstevens/) 获取本书中使用的所有示例。例如,在不到一个小时的时间里,我下载了一个 226KB 的 gzipped tar 文件,解压缩了它,运行了 Stevens 的配置例程,运行了 Makefile,该 Makefile 构建了所有程序和后续 Makefile 使用的库,并编译了第 1 章的程序。在库的 make 过程中,我遇到了一个小问题,因为我的系统上没有线程库。快速更改库 Makefile(删除对线程的引用)解决了问题。我没有编译所有提供的程序,但我编译和运行的程序都如书中所述的那样运行。

可移植意味着代码不仅可以在 Linux 系统(是的,Linux 是本书中用作示例的系统之一)上编译,还可以在 BSD、HP UNIX、Digital UNIX、Solaris (Sun/SPARC) 和 Unixware 系统上编译。其中一些系统运行 IPv4 协议栈,另一些系统运行 IPv6。代码“不在乎”;它是可移植的。贯穿本书的主题之一是程序员如何编写独立于协议栈和系统的库例程。可移植还意味着符合 POSIX 标准,特别是 P1003.1g 草案 6.6(1997 年 3 月)。

真实世界意味着代码处理错误。程序员必须不断地问“这段代码,这个库调用,这个函数会如何失败?如果失败了,我该如何优雅地结束程序或恢复并继续运行?”对于许多新程序员来说,这是一个很难学习的教训。 Stevens 担心这一点,初学者将从他的例子中受益。

带注释意味着当在书中讨论代码时,打印的清单包括代码的子目录和文件名,清单中的行被编号,并且文本中的讨论在文本的页边距中放置了适当的行号范围。这使您可以轻松地从文本(讨论一系列行)移动到打印的清单(在书中)再到实际文件(在您的硬盘上)。

本书包含的内容远不止代码。 Stevens 文笔很好。他开发了一种风格,使他能够用历史和当前的观察来打断他的叙述性讨论。他通过调整页边距和更改字体来实现这一点。很容易在第一次阅读时跳过“注释”,然后在后续阅读部分或章节时关注它们。这些注释的时效性的一个例子是他对第 99 页 拒绝服务 攻击的解释。在适当的时候,Stevens 会包含一个图表,为某个主题提供另一种解释。此外,在适当的时候,他会包含一个表格,总结一个主题的相似部分。结果是一部百科全书式的作品,但又不会让人感到窒息。

我发现我可以着手学习一个新的章节或部分,首先研究代码,然后检查图表,然后阅读文本,最后重复这个过程,可能以不同的顺序进行。随着我理解得更多,各种方法相互加强,因此整体最终大于其各部分的总和。最后,各种表格是回顾的自然场所,一旦我理解了一个主题或当我有一个具体问题时。

本书分为四个部分。第一部分是 50 页(两章)的介绍性材料。这包括上面提到的可工作的客户端-服务器程序。第二部分是 200 页(七章)。这讨论了 Berkeley 套接字使用的基本网络功能(socket、bind 等)。这部分包含许多程序和程序片段。第三部分是 500 页(18 章),处理各种主题。第四部分是 120 页(七章),涵盖了 X/Open Transport Interface 的基本 API。初学者会想仔细阅读前两部分。更高级的读者应该略读第一部分以了解 Stevens 的风格,然后在需要时参考第二部分。在很大程度上,第三部分的章节是相互独立的。这意味着,一旦第二部分的基础知识清晰,就可以很容易地在第三部分讨论的主题中进行选择。如果您对线程感兴趣,请跳到第 23 章。如果您对 IPv4 和 IPv6 感兴趣,请翻到第 10 章和第 24 章。

与其在这里给出更多细节,不如让我借用 Linux 的精神,并将您引向 Stevens 的网站。如果您在那里查看,您会找到关于 Stevens 现有每本书的信息,并且您会找到 UNIX 网络编程,第一卷,第二版 的目录、序言和示例章节。此外,您还会找到本书的代码和一个描述软件安装的 README 文件,以及排版和 troff 参考资料。最后,您将找到关于第二卷(进程间通信)和第三卷(应用程序)的信息。在我撰写这篇评论时(二月),这两卷仍在编写中。这三卷共同构成了 UNIX 网络编程 第二版。

David Bausum 于 1974 年在耶鲁大学获得数学博士学位。自 80 年代初以来,他的大部分精力都投入到软件开发和相关活动中。他与人合编了《军事史杂志累积索引:第 1-58 卷,1937-1994 年》。您可以通过电子邮件 davidb@cfw.com 与他联系。

加载 Disqus 评论