考虑以下代码片段:
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
数组。
答案 0 :(得分:1)
help.sin_addr
是struct 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