如何将addr_in结构分配给uint8_t数组

时间:2019-12-09 14:55:41

标签: c++ sockets getaddrinfo

考虑以下代码片段:

uint8_t addr[4];
inet_pton(AF_INET, args.gtp_bind_addr.c_str(), addr);

函数inet_pton()采用点分十进制形式(args.gtp_bind_addr.c_str())的IP地址,将其转换为in_addr struct并将该结构复制到addr

现在,假设给我一个sockaddr_in struct,我们称之为help。我想将addr_in帮助条目写入我的addr数组中。只需通过以下命令就能做到这一点: addr[0] = help->sin_addr

这似乎有些错误,因为我现在仅将sin_addr分配给addr[0],但是我希望它填充整个addr数组。

2 个答案:

答案 0 :(得分:1)

help.sin_addrstruct in_addr,这是一个包装单个32位整数的类类型。

struct in_addr是可分配的(来自另一个struct in_addr)。不过,它不是uint8_t(可能是这样),因此您建议的分配永远不会起作用。如果您尝试编写这样的程序,编译器会告诉您。

所以,不,这没有多大意义。问题是您在不需要时选择将数组与inet_pton一起使用。您需要做的就是提供另一个struct in_addr来填充:

struct in_addr addr;
inet_pton(AF_INET, args.gtp_bind_addr.c_str(), static_cast<void*>(&addr));

现在,您要执行的作业既有效又完全直观。

但是,等等!那为什么还要打扰中间人呢?只需直接读入目标即可:

inet_pton(AF_INET, args.gtp_bind_addr.c_str(), static_cast<void*>(&help->sin_addr));

工作完成。

答案 1 :(得分:1)

碰巧for恰好有4个字节,与struct in_addr数组的大小相同。您可以使用uint8_t复制in_addr(仅包含uint32_t)的内容:

memcpy