写入h_addr_list

时间:2013-10-10 10:28:01

标签: c sockets network-programming ipv6 ipv4

我正在编写gethostbyname()函数的包装器,在返回指向hostent结构的指针之前,应该允许执行getaddrinfo()并最终将返回的IPv6结构映射到IPv4那些。但是,我遇到了正确转换返回的in_addr结构以填充h_addr_listhostent地址的问题 - 如果家庭确定等于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代码了,很抱歉,如果我问一个愚蠢的问题。感谢。

2 个答案:

答案 0 :(得分:1)

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

hp->h_addr_list[0] 指针,因此当您在此处使用address-of运算符时,您将获得该指针的地址,并将复制到完全错误的地址。

答案 1 :(得分: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);