《TCP/IP详解 卷2:实现》 —1.5 程序示例
1.5 程序示例
在本章我们用一个简单的C程序(图1-2)来介绍一些BSD网络实现的特点。
图1-2 程序示例:发送一个数据报给UDP日期/时间服务器并读取一个应答
1. 创建一个数据报插口
19-20 socket函数创建了一个UDP 插口,并且给进程返回一个保存在变量sockfd中的描述符。差错处理函数err_sys在[Stevens 1992]的附录B.2中给出。它接收任意数量的参数,并用vsprintf对它们格式化,将系统调用产生的errno值对应的Unix错误信息打印出来,并中断进程。
我们使用术语“插口”时有三种不同的方式:(1)为4.2BSD开发的、程序用来访问网络协议的API通常叫“插口API”或者就叫“插口接口”;(2) socket是插口API中的一个函数的名字;(3)我们把调用socket创建的端点叫作插口,如注释“创建一个数据报插口”。
但是还有一些地方也使用这个术语:(4)socket函数的返回值叫“插口描述符”或者就叫“插口”;(5)在内核中的伯克利联网协议实现叫“插口实现”,相较于其他系统如System V的流实现;(6)IP地址和端口号的组合叫“插口”,IP地址和端口号对叫“插口对”。所幸的是引用哪一种术语含义是很明显的。
2. 将服务器地址放到结构sockaddr_in中
21-24 互联网插口地址结构(sockaddr_in)中存放日期/时间服务器的IP地址(140.252.1.32)和端口号(13)。大多数TCP/IP实现都提供标准的日期/时间服务器,它的端口号为13 [Stevens 1994,图1-9]。我们对服务器主机的选择是随意的—直接选择了提供此服务的本地主机(图1-17)。
函数inet_addr将一个点分十进制表示的IP地址的ASCII字符串转换成网络字节序的32 位二进制整数(Internet协议族的网络字节序采用大端模式)。函数htons把一个主机字节序的短整数(可能采用小端模式)转换成网络字节序(大端模式)。在Sparc这种系统中,整数采用大端模式,htons一般是一个什么也不做的宏。但是在采用小端模式的80386上的BSD/386系统中,htons可能是一个宏或者是一个函数,用来完成一个16位整数中的两个字节的交换。
3. 发送数据报给服务器
25-27 程序调用sendto发送一个150字节的数据报给服务器。因为是运行时栈中分配的未初始化数组,150字节的缓存内容是不确定的。但没有关系,因为服务器根本就不看它收到的报文的内容。当服务器收到一个报文时,就发送一个应答给客户端。应答中包含服务器以可读格式表示的当前时间和日期。
我们选择的150字节的客户数据报是随意的。我们有意选择一个报文长度在100~208之间的值,以便说明在本章的后面要提到的mbuf链表的使用。为了避免拥塞,在以太网中,我们希望长度要小于1472。
4. 读取从服务器返回的数据报
28-32 程序通过调用recvfrom来读取从服务器返回的数据报。Unix服务器典型地返回一个如下格式的26字节字符串
Sat Dec 11 11:28:05 1993\r\n
\r是一个ASCII回车符,\n是一个ASCII换行符。我们的程序将回车符替换成一个空字节,然后调用printf输出结果。
在本章和下一章我们分析函数socket、sendto和recvfrom的实现时,要审视这个例子的一些细节部分。
- 点赞
- 收藏
- 关注作者
评论(0)