gpt4 book ai didi

c - 类型转换 sockaddr 结构

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:45 25 4
gpt4 key购买 nike

我正在尝试学习网络编程,并在此过程中学习 C。我对作为通用地址的结构 sockaddrsockaddr_in 感到困惑。我的书是这样说的:

Thus, we can fill in the fields of a sockaddr_in and then cast (a pointer to) it to a (pointer to a) sockaddr and pass it to the socket functions, which look at the sa_family field to learn the actual type, then cast back to the appropriate type.

但在我看来,这两个结构体不应该兼容吗?一个有两个字段,

struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
};

另一个有很多

struct in_addr {
uint32_t s_addr;
};

struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};

它们的内存大小都是 16。我想这就是为什么他们对 sockaddr_in 结构进行零填充以启用转换?我仍然很困惑 - 如果你不立即回投,转换是否有意义?它是否总是只是临时转换,利用 sa_family_t 字段位于前 N 位这一事实?

最佳答案

您不需要强制转换 struct 而是指向它的指针。

底层调用的相关信息,即引用了哪个struct,可以从sin_family成员中提取,该成员在任何情况下都可用。

所以本质上,强制转换只是为了让编译器静音,因为调用的函数需要一个指向 struct sockaddr 的指针,但实际上传递的是一个指向不同类型的指针。

关于c - 类型转换 sockaddr 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32402711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com