用sockaddr_in的值填充sockaddr_storage结构 [英] Fill sockaddr_storage struct with values of sockaddr_in

查看:324
本文介绍了用sockaddr_in的值填充sockaddr_storage结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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 的类型为 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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆