我正在为 gethostbyname()
函数编写一个包装器,该函数在返回指向 hostent
结构的指针之前,应该允许执行 getaddrinfo()
并最终将返回的 IPv6 结构映射到 IPv4 结构。但是,我在正确转换返回的 in_addr
结构以填充 hostent
地址的 h_addr_list
时遇到问题 - 万一家族识别出当然等于 AF_INET
。
我基本上做了以下事情:
strcpy(&s[0],name);
hp->h_name = strdup(s);
hp->h_addrtype = AF_INET;
hp->h_length = sizeof(struct in_addr);
struct sockaddr *sa= res->ai_addr;
// Segmentation fault:
memcpy(hp->h_addr_list[0], &(((struct sockaddr_in *)sa)->sin_addr.s_addr), hp->h_length);
有什么提示吗?我已经很长时间没有写过任何 C 代码了,如果我问了一个愚蠢的问题,我很抱歉。谢谢。
最佳答案
s_addr
成员(例如 saddr->sin_addr.s_addr
)不是指针。您必须使用取址运算符使其成为指针。
并且 hp->h_addr_list[0]
是一个指针,所以当你在这里使用地址操作符时,你会得到该指针的地址,并将复制到完全错误的地址。
关于c - 写入h_addr_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293286/