0

我正在为gethostbyname()函数编写一个包装器,在返回指向hostent结构的指针之前,它应该允许执行getaddrinfo()并最终将返回的 IPv6 结构映射到 IPv4 结构。但是,我在in_addr正确转换返回的结构以填充地址h_addr_listhostent遇到问题 - 当然,如果家庭标识为 equals 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代码了,不好意思问了个愚蠢的问题。谢谢。

4

2 回答 2

1

成员(s_addr例如saddr->sin_addr.s_addr不是指针。您必须使用 address-of 运算符使其成为指针。

And hp->h_addr_list[0] 一个指针,所以当你在这里使用地址操作符时,你会得到那个指针的地址,并且会复制到完全错误的地址。

于 2013-10-10T10:34:29.720 回答
0

好的,为我分配块hostenth_addr_list为我工作,更多上下文:

hp=(struct hostent *)calloc(1,sizeof(struct hostent));

hp->h_name = strdup(s);
hp->h_aliases = NULL;
hp->h_addrtype = AF_INET;
hp->h_length = sizeof(struct in_addr);
hp->h_addr_list = (char **)calloc(2,sizeof(char *));
hp->h_addr_list[0] = calloc(1,4);
struct sockaddr *sa = res->ai_addr;

memcpy(hp->h_addr_list[0], (char *)&(((struct sockaddr_in *)sa)->sin_addr.s_addr), hp->h_length);
于 2013-10-10T13:22:49.080 回答