插座。在结构中设置sockaddr_的s_addr字段

插座。在结构中设置sockaddr_的s_addr字段,c,linux,sockets,C,Linux,Sockets,我正在尝试使用gethostbyname函数提供的数据连接到远程主机的测试代码。在示例中,我发现它们可以执行以下操作: struct hostent* pHostent = gethostbyname(host); struct sockaddr_in remoteAddr; // ... code remoteAddr.sin_addr.s_addr = ((struct in_addr*) (pHostent->h_addr))->s_addr; // ... more code

我正在尝试使用gethostbyname函数提供的数据连接到远程主机的测试代码。在示例中,我发现它们可以执行以下操作:

struct hostent* pHostent = gethostbyname(host);
struct sockaddr_in remoteAddr;
// ... code
remoteAddr.sin_addr.s_addr = ((struct in_addr*) (pHostent->h_addr))->s_addr;
// ... more code
我想知道这里在做什么

由于数据类型不同,这是否合法?也许是个回忆 应该被使用吗

为什么这样做有效?意思是什么数据 实际上居住在这两个地方


我们可以从查看实际结构布局开始:

struct hostent {
   char  *h_name;
   char **h_aliases;
   int    h_addrtype
   int    h_length;
   char **h_addr_list;
}
#define h_addr h_addr_list[0]
结构sockaddr\u in{ 小仙姑家族; 无符号短sinu端口; 结构输入地址sin地址; char sin_zero[8]; }; 地址中的结构{ uint32\u t s\u addr;//IPv4地址 }; gethostbyname函数可以为您提供IPv4或IPv6地址,具体取决于h_addrtype的值。因此,h_addr_列表需要能够保存IPv4或IPv6地址。为此,地址存储为char*指针指向的原始内存。要获取实际地址,您需要将内存强制转换为正确的地址类型,如代码中所示:

remoteAddr.sin\u addr.s\u addr=struct in\u addr*pHostent->h\u addr->s\u addr; 因此,要回答您的问题:

指针类型不同,但指向的数据类型相同。 不,数据只在一个地方,它只是被不同类型的指针引用。
我们可以从查看实际结构布局开始:

struct hostent {
   char  *h_name;
   char **h_aliases;
   int    h_addrtype
   int    h_length;
   char **h_addr_list;
}
#define h_addr h_addr_list[0]
结构sockaddr\u in{ 小仙姑家族; 无符号短sinu端口; 结构输入地址sin地址; char sin_zero[8]; }; 地址中的结构{ uint32\u t s\u addr;//IPv4地址 }; gethostbyname函数可以为您提供IPv4或IPv6地址,具体取决于h_addrtype的值。因此,h_addr_列表需要能够保存IPv4或IPv6地址。为此,地址存储为char*指针指向的原始内存。要获取实际地址,您需要将内存强制转换为正确的地址类型,如代码中所示:

remoteAddr.sin\u addr.s\u addr=struct in\u addr*pHostent->h\u addr->s\u addr; 因此,要回答您的问题:

指针类型不同,但指向的数据类型相同。 不,数据只在一个地方,它只是被不同类型的指针引用。 我正在尝试使用gethostbyname函数提供的数据连接到远程主机的测试代码-请注意,gethostbyname很旧,不推荐使用。您应该改为使用getaddrinfo,它为您提供已分配和已填充的sockaddr\u。。。适合按原样传递以连接和绑定的结构。我正在尝试使用gethostbyname函数提供的数据连接到远程主机的测试代码-请注意,gethostbyname很旧,已弃用。您应该改为使用getaddrinfo,它为您提供已分配和已填充的sockaddr\u。。。适合按原样传递以连接和绑定的结构。