我有一个sockaddr_storage
对象,我需要用用户提供的值填充它。请注意,用户可以提供其中之一AF_INET
or AF_INET6
作为填充结构的域。
void fill(sockaddr_storage &addrStruct, int domain,
const char addr[], const int port)
{
std::memset(&addrStruct, 0, sizeof(addrStruct));
switch(domain) {
case AF_INET: addrStruct.sin_family = AF_INET;
addrStruct.sin_port= htons(port);
inet_pton(AF_INET, addr, addrStruct.sin_addr);
case AF_INET6: ....
....
....
default: ....
}
}
很确定这行不通,因为addrStruct
属于类型struct sockaddr_storage
这些成员出现在struct sockaddr_in
。我也尝试过static_cast<sockaddr_in>(addrStruct).sin_port
和类似的,但这又不起作用。那么我应该如何填充这个结构,以便它保持有效值,同时尊重铸造结构的对齐。
您需要首先使用适当的地址结构,然后填写:
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port= htons(port);
然后,当你完成之后,memcpy()
它进入sockaddr_storage
:
memcpy(reinterpret_cast<char *>(&addrStruct),
reinterpret_cast<char *>(&sin), sizeof(sin));
请注意,您仍然应该将全部清零sockaddr_storage
事先缓冲,就像你所做的那样。
另一种方法是定义您自己的union
所有地址结构,包括sockaddr_storage
,然后初始化适当的union
member.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)