《TCP/IP详解 卷2:实现》 —3.5 sockaddr结构

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

3.5   sockaddr结构

一个接口的编址信息不仅仅包括一个主机地址。Net/3在通用的sockaddr结构中维护主机地址、广播地址和网络掩码。通过使用一个通用的结构,将硬件与协议专用的地址细节相对于接口层隐藏起来。

图3-17显示的是这个结构的当前定义及早期BSD版的定义—结构osockaddr。图3-18说明了这些结构的组织。

image.png

图3-17   结构sockaddr和osockaddr

image.png

图3-18   结构sockaddr和osockaddr(省略了前缀sa_)

在很多图中,我们省略了成员名中的公共前缀。在这里,我们省略了sa_前缀。

1. sockaddr结构

120-124   每个协议有它自己的地址格式。Net/3在一个sockaddr结构中处理通用的地址。sa_len指示地址的长度(OSI和Unix域协议有不同的地址长度),sa_family指示地址的类型。图3-19列出了地址族(address family)常量,其中包括我们遇到的。

当指明为AF_UNSPEC时,sockaddr的内容要根据情况而定。大多数情况下,它包含一个以太网硬件地址。

成员sa_len和sa_family允许协议无关代码操作来自多个协议的变长的sockaddr结构。剩下的成员sa_data包含一个协议相关格式的地址。sa_data定义为一个14字节的数组,但当sockaddr结构覆盖更大的内存空间时,sa_data可能会扩展到253字节。sa_len仅有一个字节,因此整个地址包括sa_len和sa_family必须不超过256字节。

这是C语言的一种通用技术,它允许程序员把一个结构中的最后一个成员看成是可变长的。

image.png

每个协议定义一个专用的sockaddr结构,该结构复制成员sa_len和sa_family,但按相应协议的要求来定义成员sa_data。存储在sa_data中的地址是一个传输地址,它包含足够的信息来标识同一主机上的多个通信端点。在第6章我们要查看Internet地址结构sockaddr_in,它包含了一个IP地址和一个端口号。

2. osockaddr结构

271-274   结构osockaddr是4.3BSD Reno版本以前的sockaddr定义。因为在这个定义中一个地址的长度不是显式地可用,所以它不能用来写能够处理可变长地址的协议无关代码。OSI协议使用可变长地址,为了包括OSI协议,在Net/3的sockaddr定义中才有了我们所见的改变。结构osockaddr是为了支持对以前编译的程序的二进制兼容。

在本书中我们省略了二进制兼容代码。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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