用sockaddr_in的值填充sockaddr_storage结构 [英] Fill sockaddr_storage struct with values of sockaddr_in
问题描述
我有一个sockaddr_storage对象,需要用用户提供的值填充它。请注意,用户可以提供 AF_INET
或 AF_INET6
作为域来填充结构。
I've a sockaddr_storage object and I need to fill it with values provided by the user. Note that user can provide either of AF_INET
or AF_INET6
as domain for filling up the struct.
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 $ c $起不起作用c>的类型为
struct sockaddr_storage
,这些成员位于 struct sockaddr_in
中。我还尝试了 static_cast< sockaddr_in>(addrStruct).sin_port
和类似的方法,但这再次无效。因此,我应该如何填充此结构,以使其在尊重转换结构的对齐方式的同时保留有效值。
Pretty sure this doesn't works since addrStruct
is of type struct sockaddr_storage
and these members are present in struct sockaddr_in
. I also tried static_cast<sockaddr_in>(addrStruct).sin_port
and similar but that again doesn't works. So how should I be filling up this struct so that it holds valid values while respecting alignment of casted structs.
推荐答案
首先使用适当的地址结构,并将其填写:
You need to use the appropriate address structure first, and fill it out:
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 $ c $归零。
Note that you should still zero out the full sockaddr_storage
buffer beforehand, as you did.
另一种方法是定义自己的 union
地址结构,包括 sockaddr_storage
,然后初始化相应的 union
成员。
Another way to do it is to define your own union
of all the address structures, including sockaddr_storage
, then initialize the appropriate union
member.
这篇关于用sockaddr_in的值填充sockaddr_storage结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!