插座。在结构中设置sockaddr_的s_addr字段
我正在尝试使用gethostbyname函数提供的数据连接到远程主机的测试代码。在示例中,我发现它们可以执行以下操作:插座。在结构中设置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
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。。。适合按原样传递以连接和绑定的结构。