为什么`struct sockaddr`包含一个地址族字段?

时间:2011-03-10 17:16:02

标签: c sockets unix

为什么struct sockaddr包含地址系列字段?通过调用socket()确定地址系列是否已修复?

4 个答案:

答案 0 :(得分:4)

sockaddr用于connectbind以外的其他地方,包括您对所涉及的地址系列没有一些外部知识的地方 - getaddrinfo之一。

此外,虽然我不相信以下等同于在任何地方练习,但我可以看到它最初是在设计这些东西的人眼中:对socket()的调用定义了协议族。 sockaddr包含地址系列。在实践中,我相信它们总是一样的,但理论上你可以有一个能够支持两种不同地址类型的协议。

编辑:参数有用的另一种方式。如果您正在使用数据报(UDP)套接字,并且您的套接字处于“已连接”状态且具有默认目标地址,则可以connect()使用sockaddr {sa_family来调用AF_UNSPEC {1}}设置为{{1}}。

答案 1 :(得分:2)

如果你看一下getaddrinfo接口,这是在地址(名称或数字地址)和sockaddr结构的交换表示之间进行转换的唯一现代正确方法,我想你会看到为什么需要它。

话虽如此,整个struct sockaddr的东西是一堆乱七八糟的错误设计,尤其是用户空间的字节序转换。

需要sa_family字段的另一个好例子是getsocknamegetpeername接口。如果程序从另一个程序继承了文件描述符,并且还不知道它是什么类型的套接字,则它需要能够确定为了建立新连接,甚至将地址转换为适合交换的表示。

答案 2 :(得分:1)

如果查看套接字接口所在的4.2BSD的网络代码,您会看到sockaddr传递给网络接口驱动程序,但套接字fd不是。

答案 3 :(得分:0)

sa_family字段用于指示sa_data字段中的地址类型。在许多应用中,地址族被假定为IPV4。但是,许多应用程序也支持IPV6。