首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sockaddr和IPv6地址

sockaddr和IPv6地址
EN

Stack Overflow用户
提问于 2014-07-18 05:13:14
回答 2查看 7K关注 0票数 2

我只是想了解getaddrinfo()行为。

代码语言:javascript
复制
int getaddrinfo(const char *node, const char *service,
                const struct addrinfo *hints,
                struct addrinfo **res);

由此产生的IP(v4/v6)处理保存在(每个) struct中的数据。

代码语言:javascript
复制
struct addrinfo {
    int              ai_flags;
    int              ai_family;
    int              ai_socktype;
    int              ai_protocol;
    socklen_t        ai_addrlen;
    struct sockaddr *ai_addr;
    char            *ai_canonname;
    struct addrinfo *ai_next;
};


struct sockaddr {
    unsigned short    sa_family;    // address family, AF_xxx
    char              sa_data[14];  // 14 bytes of protocol address
};

如果结果之一是IPv6地址(16字节),如何将其保存在大小为< IPv6地址的sockaddr类型的ai_addr中。

我在这里的问题是,我将ai_addr类型转换为sockaddr_storage

代码语言:javascript
复制
(struct sockaddr_storage *)(res->ai_addr)

最后以gcc警告结束:

警告:强制转换增加目标类型所需的对齐。

将sockaddr类型转换为sockaddr_storage的正确方法是什么?

在几个答案之后更新:

问题是gcc警告:

代码语言:javascript
复制
> warning: cast increases required alignment of target type

解决这一问题的办法是:

代码语言:javascript
复制
(struct sockaddr_storage *)(void *)(res->ai_addr)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-18 07:33:23

ai_addr只是一个指针。根据ai_familyai_addr背后的实际结构不同:

  • 如果ai_familyAF_INET,那么它实际上是指向sockaddr_in结构的指针。
  • 如果ai_familyAF_INET6,则它是指向sockaddr_in6结构的指针。

由于sockaddr_insockaddr_in6sockaddr_storage (inman.html)的结构,您可以根据上面描述的ai_family来转换指向实际结构的指针。

票数 4
EN

Stack Overflow用户

发布于 2014-07-18 05:55:18

您应该使用sockaddr_storage作为套接字类型,因为它对IPv4和IPv6都足够大,并且可以转换为sockaddr。

代码语言:javascript
复制
struct sockaddr_storage {
    sa_family_t  ss_family;     // address family

    // all this is padding, implementation specific, ignore it:
    char      __ss_pad1[_SS_PAD1SIZE];
    int64_t   __ss_align;
    char      __ss_pad2[_SS_PAD2SIZE];
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24817642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档