为什么struct sockaddr
包含地址系列字段?通过调用socket()
确定地址系列是否已修复?
答案 0 :(得分:4)
sockaddr
用于connect
和bind
以外的其他地方,包括您对所涉及的地址系列没有一些外部知识的地方 - getaddrinfo
之一。
此外,虽然我不相信以下等同于在任何地方练习,但我可以看到它最初是在设计这些东西的人眼中:对socket()
的调用定义了协议族。 sockaddr
包含地址系列。在实践中,我相信它们总是一样的,但理论上你可以有一个能够支持两种不同地址类型的协议。
编辑:参数有用的另一种方式。如果您正在使用数据报(UDP)套接字,并且您的套接字处于“已连接”状态且具有默认目标地址,则可以connect()
使用sockaddr
{sa_family
来调用AF_UNSPEC
{1}}设置为{{1}}。
答案 1 :(得分:2)
如果你看一下getaddrinfo
接口,这是在地址(名称或数字地址)和sockaddr
结构的交换表示之间进行转换的唯一现代正确方法,我想你会看到为什么需要它。
话虽如此,整个struct sockaddr
的东西是一堆乱七八糟的错误设计,尤其是用户空间的字节序转换。
需要sa_family
字段的另一个好例子是getsockname
和getpeername
接口。如果程序从另一个程序继承了文件描述符,并且还不知道它是什么类型的套接字,则它需要能够确定为了建立新连接,甚至将地址转换为适合交换的表示。
答案 2 :(得分:1)
如果查看套接字接口所在的4.2BSD的网络代码,您会看到sockaddr
传递给网络接口驱动程序,但套接字fd不是。
答案 3 :(得分:0)
sa_family字段用于指示sa_data字段中的地址类型。在许多应用中,地址族被假定为IPV4。但是,许多应用程序也支持IPV6。