我正在尝试学习网络编程和C语言。我对两个结构体
因此,我们可以填充一个sockaddr_in的字段,然后将其(指针)转换为(指向)sockaddr的指针,并将其传递给socket函数,该函数查看sa_family字段以了解实际类型,然后再次转换为适当的类型。
但是在我看来,这两个结构体似乎不应该兼容?其中一个有两个字段,
另一个有很多。
sockaddr
(通用地址)和sockaddr_in
感到困惑。我的书上这样说:因此,我们可以填充一个sockaddr_in的字段,然后将其(指针)转换为(指向)sockaddr的指针,并将其传递给socket函数,该函数查看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
位的事实吗?