《TCP/IP详解 卷2:实现》 —3.5 sockaddr结构
3.5 sockaddr结构
一个接口的编址信息不仅仅包括一个主机地址。Net/3在通用的sockaddr结构中维护主机地址、广播地址和网络掩码。通过使用一个通用的结构,将硬件与协议专用的地址细节相对于接口层隐藏起来。
图3-17显示的是这个结构的当前定义及早期BSD版的定义—结构osockaddr。图3-18说明了这些结构的组织。
图3-17 结构sockaddr和osockaddr
图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语言的一种通用技术,它允许程序员把一个结构中的最后一个成员看成是可变长的。
每个协议定义一个专用的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是为了支持对以前编译的程序的二进制兼容。
在本书中我们省略了二进制兼容代码。
- 点赞
- 收藏
- 关注作者
评论(0)