c - 类型转换 sockaddr 结构

标签 c sockets casting

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

相关文章:

objective-c - 是什么导致此命令行错误?

c++ - 如何从 IStream 读取到一个 char 数组并将其写入另一个 IStream?

Linux 原始套接字 (layer2) - 最佳策略

java - Java 中的继承和转换

java - 为什么你可以在不进行类型转换的情况下将 long 存储到 float 中

c - 什么会导致程序中的非确定性输出?

c - double to int in c

c++ - 关于 Linux 上的共享库的良好做法是什么?

ajax - Arduino WebServer和socket.io

java - 关于类变量的向上转换和向下转换有什么区别