为什么struct sockaddr
包含地址族字段?难道地址族不是通过调用socket()
已经固定了吗?
sockaddr
不仅在connect
和bind
中使用,在一些你没有外部地址族知识的地方也会用到,比如getaddrinfo
。
此外,虽然我不认为以下内容在任何地方都等同于实践,但我可以看出它曾经是设计这些东西的人的关注点:对socket()
的调用定义了协议族。而sockaddr
则包含地址族。在实践中,我相信这两者总是相同的,但你理论上可以有一个能够支持两种不同地址类型的协议。
编辑:还有另一种方式可以使用该参数。如果你正在使用数据报(UDP)套接字,并且你有一个处于“已连接”状态并具有默认目标地址的套接字,则可以通过调用connect()
并将sockaddr
的sa_family
设置为AF_UNSPEC
来清空该地址。
struct sockaddr
比getaddrinfo
早至少15年。 - Fred Foosa_family字段用于告诉sa_data字段中将包含什么类型的地址。在许多应用程序中,地址族被假定为IPV4。然而,许多应用程序也支持IPV6。