《TCP/IP详解 卷2:实现》 —1.5 程序示例

举报
华章计算机 发表于 2019/11/20 15:40:58 2019/11/20
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第1章,第1.5节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。

1.5   程序示例

在本章我们用一个简单的C程序(图1-2)来介绍一些BSD网络实现的特点。

image.png

图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的实现时,要审视这个例子的一些细节部分。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。