目前已经有很多介绍计算机网络的书籍,但是它们之中的大多数似乎更适合于高级编程者,而对于众多只想了解使用方法的初学者而言,就显得太深奥了。
读者通过学习本书,可以掌握有关套接口编程的知识。同时,本书使用一种称为'BY example'的方法来提高读者的学习效率,书中每一章的内容都是建立在前一章的基础之上的。第一部分“基本套接口概念”在阐明域和地址族,套接口的类型以及面向连接/非连接协议等基本概念的基础上,介绍了简单的客户/服务器程序的编写方法和主机名/网络名查询程序的编写方法。在掌握了第一部分“基本套接口概念”之后,读者就可以开始学习第二部分“高级套接口编程”,这对于有些读者而言可能是个挑战。这一部分介绍了套接口标准I/O,并发客户服务程序,套接口选项,UDP广播,带外数据,inetd守护进程,网络安全程序设计以及信任状和文件描述符等较为深入的主题;并通过最后一章的应用实例,将前面介绍的诸多概念融合在一起。
\r\n
第一部分 基本套接口概念\r\n\r\n第一章 套接口简介\r\n\r\n1.1 简要的历史回顾\r\n1.2 理解套接口\r\n1.2.1 定义套接口\r\n1.2.2 使用套接口\r\n1.2.3 引用套接口\r\n1.3 套接口和管道\r\n1.4 创建套接口\r\n1.4.1 socketpair(2)使用范例\r\n1.4.2 运行例程\r\n1.5 用套接口实现I/O\r\n1.6 关闭套接口\r\n1.6.1 shutdown(2)函数\r\n1.6.2 关闭向套接口的写入\r\n1.6.3 处理复制套接口\r\n1.6.4 关闭从套接口的读入\r\n1.6.5 什么时候不能使用shutdown(2)\r\n1.7 客户/服务器应用编程\r\n\r\n第二章 域和地址族\r\n\r\n2.1 无名套接口\r\n2.2 域\r\n2.3 生成套接口地址\r\n2.4 生成本地地址\r\n2.4.1 生成传统本地地址\r\n2.4.2 生成抽象本地地址\r\n2.5 生成Internet(IPv4)套接口地址\r\n2.5.1 理解网络字节序\r\n2.5.2 在大端/小端字节序之间实现转换\r\n2.5.3 初始化一个通配的Internet地址\r\n2.5.4 初始化一个特定的Internet地址\r\n2.6 生成X.25地址\r\n2.7 生成其他地址族\r\n2.8 AF_UNSPEC地址族\r\n\r\n第三章 地址转换函数\r\n\r\n3.1 Internet IP地址\r\n3.1.1 Internet地址分类\r\n3.1.2 理解网络掩码\r\n3.2 分配IP地址\r\n3.2.1 私有IP地址\r\n3.2.2 保留IP地址\r\n3.3 操作IP地址\r\n3.3.1 inet_addr(3)函数\r\n3.3.2 inet_aton(3)函数\r\n3.3.3 iner_ntoa(3)函数\r\n3.3.4 inet_network(3)函数\r\n3.3.5 inet_lnaof()函数\r\n3.3.6 inet_netof(3)函数\r\n3.3.7 inet_makeaddr(3)函数\r\n\r\n第四章 套接口的类型与协议\r\n\r\n4.1 指定套接口的域\r\n4.1.1 PF_INET和AF_INET\r\n4.1.2 使用PF_LOCAL和AF_LOCAL\r\n4.2 使用socket(2)涵数\r\n4.3 选择套接口类型\r\n4.3.1 理解SOCK_STREAM套接口类型\r\n4.3.2 理解SOCK_DGRAM套接口类型\r\n4.3.3 理解SOCK_SEQPACKET套接口类型\r\n4.4 选择协议\r\n4.4.1 使用PF_LOCAL和SOCK_STREAM\r\n4.4.2 使用PF_LOCAL和SOCK_DGRAM\r\n4.4.3 使用PF_INET和SOCK_STREAM\r\n4.4.4 使用PF_INET和SOCK_DGRAM\r\n4.5 套接口Domain和Type参数的总结\r\n4.6 Linux支持的其他协议\r\n\r\n第五章 为套接口绑定地址\r\n\r\n5.1 bind(2)函数的作用\r\n5.2 使用bind(2)函数\r\n5.3 获得套接口地址\r\n5.3.1 编写函数sock_addr()\r\n5.3.2 获得对等套接口地址\r\n5.4 接口与定址\r\n5.4.1 指定接口地址的图例\r\n5.4.2 绑定一个特定的接口地址\r\n5.4.3 绑定通配接口\r\n\r\n第六章 面向非连接的协议\r\n\r\n6.1 通信的方法\r\n6.1.1 非连接通信的优点\r\n6.1.2 非连接通信的缺点\r\n6.2 实现数据报的输入和输出\r\n6.2.1 sendto(2)函数介绍\r\n6.2.2 recvfrom(2)函数介绍\r\n6.3 编写UDP数据报服务器程序\r\n6.4 编写UDP数据报客户程序\r\n6.5 测试UDP数据报服务器/客户程序\r\n6.5.1 在没有服务器的状态下进行测试\r\n6.5.2 使用非缺省的IP地址进行测试\r\n6.5.3 在客户程序中省略bind(2)调用\r\n6.5.4 对通配地址的应答\r\n\r\n第七章 面向连接的协议——客户端\r\n\r\n7.1 通信方法的回顾\r\n7.2 Internet服务\r\n7.2.1 /etc/services文件\r\n7.2.2 使用getservent(3)函数\r\n7.2.3 使用setservent(3)函数\r\n7.2.4 使用endservent(3)函数\r\n7.2.5 通过名字和协议查询服务\r\n7.2.6 通过端口和协议查询服务\r\n7.3 /etc/protocols文件\r\n7.3.1 使用setprotoent(3)函数\r\n7.3.2 使用endprotoent(3)函数\r\n7.3.3 通过名字查询协议\r\n7.3.4 通过协议号查询协议\r\n7.4 编写TCP/IP客户程序\r\n7.4.1 connect(2)函数\r\n7.4.2 为编写客户程序做准备\r\n7.4.3 daytime客户程序\r\n7.5 在SOCK_DGRAM套接口中使用connect(2)\r\n\r\n第八章 面向连接的协议——服务器端\r\n\r\n8.1 服务器的作用\r\n8.2 listen(2)函数\r\n8.2.1 监听队列\r\n8.2.2 指定backlog的值\r\n8.3 accept(2)函数\r\n8.4 编写一个TCP/IP服务器程序\r\n8.5 修改客户程序\r\n\r\n第九章 主机名和网络名查询\r\n\r\n9.1 理解名字的必要性\r\n9.2 uname(2)函数\r\n9.3 获取主机名和域名\r\n9.3.1 gethostname(2)函数\r\n9.3.2 getdomainname(2)函数\r\n9.3.3 测试gethostname(2)函数和getdomainname(2)函数\r\n9.4 解析远程地址\r\n9.4.1 错误报告\r\n9.4.2 报告h_errno错误\r\n9.4.3 gethostbyname(3)函数\r\n9.4.4 gethostbyname(3)函数应用示例\r\n9.4.5 gethostbyaddr(3)函数\r\n9.4.6 sethostent(3)函数\r\n9.4.7 endhostent(3)函数\r\n\r\n第二部分 高级套接口编程\r\n\r\n第十章 套接口上的标准I/O\r\n\r\n10.1 使用标准I/O流的必要性\r\n10.2 连接套接口与流\r\n10.3 关闭套接口流\r\n10.4 分开使用读写流\r\n10.4.1 复制套接口\r\n10.4.2 关闭套接口上的读/写流\r\n10.5 建立通信连接\r\n10.5.1 只关闭写端\r\n10.5.2 只关闭读端\r\n10.5.3 同时关闭读写端\r\n10.6 中断处理\r\n10.7 定义缓冲操作\r\n10.8 在套接口上使用FILE流\r\n10.8.1 mkaddr()函数\r\n10.8.2 RPN计算器引擎代码\r\n10.8.3 测试RPN服务器程序\r\n\r\n第十一章 并发客户服务程序\r\n\r\n11.1 理解多客户问题\r\n11.2 服务器函数概览\r\n11.3 使用fork(2)函数实现多客户服务\r\n11.3.1 理解全局服务进程\r\n11.3.2 理解子服务进程流\r\n11.3.3 理解进程的终止处理\r\n11.4 使用select(2)函数设计服务器程序\r\n11.4.1 select(2)函数简介\r\n11.4.2 使用文件描述符集合\r\n11.5 服务器程序设计中使用select(2)函数\r\n11.5.1 使用select(2)函数的服务器程序\r\n11.5.2 例程中的有关限制\r\n\r\n第十二章 套接口选项\r\n\r\n12.1 取套接口的选项值\r\n12.2 设置套接口选项\r\n12.3 取套接口类型(SO_TYPE)\r\n12.4 设置SO_REUSEADDR选项\r\n12.5 设置SO_LINGER选项\r\n12.6 设置SO_KEEPALIVE选项\r\n12.7 设置SO_BROADCAST选项\r\n12.8 设置SO_OOBINLINE选项\r\n12.9 选项SO_PASSCRED和SO_PEERCRED\r\n\r\n第十三章 UDP广播\r\n\r\n13.1 理解广播地址\r\n13.1.1 在255.255.255.255上广播\r\n13.1.2 增强mkaddr.c子程序的功能\r\n13.2 服务器广播\r\n13.3 接收广播\r\n13.4 广播演示\r\n13.5 面向网络的广播\r\n13.5.1 启动广播\r\n13.5.2 接收本地广播信息\r\n13.5.3 接收远程广播信息\r\n13.5.4 调试\r\n\r\n第十四章 带外数据\r\n\r\n14.1 带外数据概念\r\n14.2 带外数据的必要性\r\n14.3 套接口与带外数据\r\n14.4 实现中的两种语义解释\r\n14.5 使用带外数据\r\n14.5.1 写带外数据\r\n14.5.2 读带外数据\r\n14.5.3 理解SIGURG信号\r\n14.5.4 支撑子程序\r\n14.5.5 使用SIGURG信号接收带外数据\r\n14.5.6 发送带外数据\r\n14.5.7 测试oobrecv和oobsend程序\r\n14.6 紧急指针\r\n14.6.1 TCP紧急模式\r\n14.6.2 tcp_stdurg=1时的紧急模式\r\n14.7 接收内嵌带外数据\r\n14.7.1 确定紧急指针位置\r\n14.7.2 使用内嵌带外数据\r\n14.8 紧急指针的有关限制\r\n\r\n第十五章 使用守护进程inetd\r\n\r\n15.1 一般服务程序所遵循的通用模式\r\n15.2 inetd简介\r\n15.2.1 /etc/inetd.conf配置文件\r\n15.2.2 inetd服务程序的设计参数\r\n15.3 一个简单的TCP服务程序\r\n15.3.1 通过inetd调用服务程序\r\n15.3.2 禁止新增加的服务\r\n15.4 数据报服务程序\r\n\r\n第十六章 网络安全程序设计\r\n\r\n16.1 什么是安全性\r\n16.2 来自安全方面的挑战\r\n16.3 区分合法用户与不合法用户\r\n16.3.1 通过主机名或域名识别客户\r\n16.3.2 通过IP地址识别客户\r\n16.4 给inetd服务增加安全措施\r\n16.4.1 集中式网络安全策略\r\n16.4.2 理解TCP外包器概念\r\n16.4.3 辨别客户的访问权限\r\n16.5 安装外包器和服务程序\r\n16.5.1 服务程序与外包器的日志代码\r\n16.5.2 UDP服务程序代码\r\n16.5.3 一个简单的TCP外包器程序\r\n16.6 客户端程序\r\n16.7 安装并测试外包器\r\n16.7.1 监视日志文件\r\n16.7.2 启动inetd守护进程\r\n16.7.3 测试外包器程序\r\n16.7.4 测试服务器超时\r\n16.7.5 卸载示范程序\r\n16.7.6 数据报的缺陷\r\n\r\n第十七章 传递信任状和文件描述符\r\n\r\n17.1 问题\r\n17.2 辅助数据简介\r\n17.3 I/O向量简介\r\n17.3.1 I/O向量(struct iovec)\r\n17.3.2 readv(2)函数和writev(2)函数\r\n17.4 sendmsg(2)函数和recvmsg(2)函数\r\n17.4.1 sendmsg(2)函数\r\n17.4.2 recvmsg(2)函数\r\n17.4.3 msghdr结构\r\n17.5 辅助数据结构和宏\r\n17.5.1 cmsghdr结构简介\r\n17.5.2 cmsg(3)宏简介\r\n17.5.3 创建辅助数据\r\n17.6 辅助数据例程\r\n17.6.1 通用头文件common.h\r\n17.6.2 misc.c模块\r\n17.6.3 recvcred.c模块\r\n17.6.4 一个简单的Web服务器例程web80\r\n17.6.5 reqport()函数\r\n17.6.6 recv_fd()函数\r\n17.6.7 服务器程序sockserv\r\n17.6.8 send_fd()函数\r\n17.7 测试套接口服务器\r\n\r\n第十八章 一个实用的网络工程项目\r\n\r\n18.1 问题\r\n18.2 解决报价服务问题\r\n18.3 测试报价服务器程序\r\n18.4 通过get_tickinfo()获得报价单\r\n18.5 通过broadcast()函数进行报价广播\r\n18.6 分析客户端程序\r\n18.7 编译并运行演示程序\r\n18.7.1 启动报价服务器qserve\r\n18.7.2 启动客户端程序mktwatch\r\n18.7.3 如果finance.yahoo.com服务发生变化\r\n\r\n附录A 套接口函数快速索引\r\n\r\nA.1 特定的套接口函数\r\nA.2 套接口定址函数\r\nA.3 读套接口函数\r\nA.4 写套接口函数\r\nA.5 其他套接口I/O函数\r\nA.6 套接口控制函数\r\nA.7 网络支持函数\r\nA.8 标准I/O支持函数\r\nA.9 主机名支持函数\r\n\r\n附录B 套接口相关的数据结构索引\r\n\r\nB.1 套接口地址结构\r\nB.2 其他数据结构\r\nB.3 与I/O相关的数据结构\r\n\r\n附录C 一些常用的表格\r\n\r\n附录D 术语表