c - 写入h_addr_list

标签 c sockets network-programming ipv6 ipv4

我正在为 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/

相关文章:

转换时间格式

c - 使用 hexdump 查看静态变量

c - 那么这2种socket处理方式有什么区别呢?

c - Socket编程客户端服务器消息读写C

c - 如何用 C 创建 BACnet 客户端

c - 如何编写一个恒定时间函数以将最高有效位复制到所有位

javascript - 在javascript中读取C程序的输出文件

c++ - 套接字始终返回INVALID_SOCKET

linux - 为什么 C99 提示存储大小?

c++ - 我可以在我的 VCL 客户端-服务器应用程序中使用端口 80 吗?