gpt4 book ai didi

c - socket 。设置 sockaddr_in 结构的 s_addr 字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:14 25 4
gpt4 key购买 nike

我正在尝试使用 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

我试图了解这里正在做什么。

  1. 数据类型不同是否合法?可能是一个memcpy()应该用过?

  2. 为什么这行得通?表示什么数据居然两地都住?

最佳答案

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

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]
struct sockaddr_in {
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct in_addr {
uint32_t s_addr; // IPv4 address
};

gethostbyname() 函数可以为您提供 IPv4 或 IPv6 地址,具体取决于 h_addrtype 的值。所以 h_addr_list 需要能够保存 IPv4 或 IPv6 地址。为此,地址存储为 char* 指针指向的原始内存。要获得实际地址,您需要将内存转换为正确的地址类型,如您在代码中所见:

remoteAddr.sin_addr.s_addr = ((struct in_addr*) (pHostent->h_addr))->s_addr;

所以回答你的问题:

  1. 指针类型不同,但指向的数据是同一类型。
  2. 不,数据只在一个地方,它只是被不同类型的指针引用。

关于c - socket 。设置 sockaddr_in 结构的 s_addr 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58389455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com