【发布时间】:2015-10-24 14:24:22
【问题描述】:
我遇到了一个引用它的套接字编程教程
“指向 struct sockaddr_in 的指针可以转换为指向 struct sockaddr 的指针反之亦然”
我不明白如何将 sockaddr_in 转换为 sockaddr。将 Big 类型的指针转换为 Small 类型应该会产生 UD 行为。
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
演员阵容如何不被定义?将它们相互投射会不会不安全?
如果我有一个只有两个整数的 A 类和有 4 个整数的 B 类。如果我有一个 B 类型的指针并且我将它转换为 A 类型,那么确保我可以获取前两个元素。但是,如果 A 类首先声明了 2 个字符,然后声明了 2 个整数,那么指针将无法正确获取值,因为在这种情况下对象布局会有所不同。
编辑 1:
class Anu
{
public:
char a;
int b;
Anu()
{
a='a';
}
};
class Anurag
{
public:
Anurag() { a=4;}
int a;
int b;
int c;
int d;
};
int main()
{
Anu objanu;
Anurag objanurag;
Anurag *ptrAnurag= &objanurag;
ptrAnurag= (Anurag*)&objanu;
cout<<ptrAnurag->a; //Some weird value here
return 0;
}
假设我通过调整变量类型更改示例以使两个类具有相同的大小...即使大小保持不变,对象布局仍然可能不同。
【问题讨论】:
-
它们的大小有何不同? sockaddr: 2+14=16, sockaddr_in:2+2+4+8=16
-
是的,你是对的。但是 sockaddr 和 sockaddr_in 的对象布局会有所不同,即使大小看起来相似。将存储在 sockaddr 中的第一件事是代表 sa_family 的 2 个字节。然而,在 sockaddr_in 对象中,首先存储的是一个 4 字节的 int,表示 sin_family。如果 sockaddr_in 类型指针指向 sockaddr,则结果将是 UD,反之亦然。
-
不不,但 sin_family 不是 'int' 它是 'short int' 感谢 c++ 人员,但我只使用 'short' 来缩短问题 :)
-
sin_port vs sa_data 类型呢?