为什么在调用 bind() 时要将 sockaddr_in 转换为 sockaddr?
- 2024-10-21 09:14:00
- admin 原创
- 120
问题描述:
bind ()函数接受指向 的指针sockaddr
,但在我见过的所有例子中,sockaddr_in
都使用结构来代替,并转换为sockaddr
:
struct sockaddr_in name;
...;
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) {
...;
}
我不明白为什么要sockaddr_in
使用结构体。为什么不直接准备并传递一个sockaddr
?
这只是惯例吗?
解决方案 1:
不,这不仅仅是惯例。
sockaddr
是任何类型的套接字操作的通用描述符,而是sockaddr_in
基于 IP 通信的特定结构(如果我没记错的话,“in”代表“InterNet”)。据我所知,这是一种“多态性”:该bind()
函数假装接受一个struct sockaddr *
,但实际上,它会假定传入了适当类型的结构;即与您作为第一个参数提供的套接字类型相对应的结构。
解决方案 2:
我不知道这是否与这个问题非常相关,但我想提供一些额外的信息,这可能会使类型种姓更容易理解,因为许多没有花太多时间的人C
看到这样的类型种姓会感到困惑。
我使用macOS
,因此我根据系统中的头文件来举例。
struct sockaddr
定义如下:
struct sockaddr {
__uint8_t sa_len; /* total length */
sa_family_t sa_family; /* [XSI] address family */
char sa_data[14]; /* [XSI] addr value (actually larger) */
};
struct sockaddr_in
定义如下:
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
从最基础的开始,指针只包含一个地址。所以struct sockaddr *
和struct sockaddr_in *
几乎相同。它们都只存储一个地址。唯一相关的区别是编译器如何处理它们的对象。
因此,当您说时(struct sockaddr *) &name
,您只是在欺骗编译器并告诉它这个地址指向一个struct sockaddr
类型。
假设指针指向某个位置1000
。如果struct sockaddr *
存储了该地址,它将根据结构定义考虑从1000
到的内存拥有成员。如果存储了相同的地址,它将考虑从到 的内存。sizeof(struct sockaddr)
`struct sockaddr_in *1000
sizeof(struct sockaddr_in)`
当您对该指针进行类型转换时,它将考虑相同的字节序列sizeof(struct sockaddr)
。
struct sockaddr *a = &name; // consider &name = 1000
现在,如果我访问a->sa_len
,编译器将从 位置访问1000
,sizeof(__uint8_t)
其字节大小与 的情况相同sockaddr_in
。因此这应该访问相同的字节序列。
同样的模式也适用于sa_family
。
之后有一个 14 字节字符数组,其中struct sockaddr
存储来自in_port_t sin_port
(typedef
16 位无符号整数 = 2 字节)、struct in_addr sin_addr
(简单来说 32 位 ipv4 地址 = 4 字节)和char sin_zero[8]
(8 字节)的数据。这 3 个加起来是 14 个字节。
现在这三个都存储在这个 14 字节字符数组中,我们可以通过访问适当的索引并再次对其进行类型转换来访问这三个中的任何一个。
user529758 的回答已经解释了这样做的原因。
解决方案 3:
这是因为 bind 可以绑定除 IP 套接字之外的其他类型的套接字,例如 Unix 域套接字,其类型为 sockaddr_un。AF_INET 套接字的地址包含主机和端口,而 AF_UNIX 套接字包含文件系统路径。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件