我正在尝试学习网络编程,并在此过程中学习C.我对作为通用地址sockaddr
的结构sockaddr_in
感到困惑。我的书有这样说:
因此,我们可以填写sockaddr_in的字段然后进行转换(a 指向它的指针(指向a)指向sockaddr并将其传递给套接字 函数,它们查看sa_family字段以了解实际类型, 然后再回到适当的类型。
但在我看来这两个结构应该兼容吗?一个有两个字段,
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
位的事实?
答案 0 :(得分:0)
不要求您投射struct
,而是指向它。
可以从struct
成员中提取基础调用的相关信息,即引用sin_family
的成员,该成员在任何情况下都可用。
所以从本质上来说,强制转换是为了使编译器静音,因为调用的函数需要一个指向struct sockaddr
的指针,但实际上它会传递一个指向不同类型的指针。