我正在编写gethostbyname()
函数的包装器,在返回指向hostent
结构的指针之前,应该允许执行getaddrinfo()
并最终将返回的IPv6结构映射到IPv4那些。但是,我遇到了正确转换返回的in_addr
结构以填充h_addr_list
个hostent
地址的问题 - 如果家庭确定等于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代码了,很抱歉,如果我问一个愚蠢的问题。感谢。
答案 0 :(得分:1)
s_addr
成员(例如saddr->sin_addr.s_addr
)不是指针。您必须使用address-of运算符使其成为指针。
hp->h_addr_list[0]
是指针,因此当您在此处使用address-of运算符时,您将获得该指针的地址,并将复制到完全错误的地址。
答案 1 :(得分:0)
好的,为hostent
和h_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);