我正在尝试学习网络编程,并在此过程中学习 C。我对作为通用地址的结构 sockaddr
和 sockaddr_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/