Typecasting sockaddr结构

时间:2015-09-04 16:30:16

标签: c sockets casting

我正在尝试学习网络编程,并在此过程中学习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位的事实?

1 个答案:

答案 0 :(得分:0)

不要求您投射struct,而是指向它。

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

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