gpt4 book ai didi

c - sockaddr和IPv6地址

转载 作者:行者123 更新时间:2023-12-03 11:51:10 26 4
gpt4 key购买 nike

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

int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);

生成的IP(v4/v6)地址保存在(每个)结构addrinfo中的数据。
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字节),如何将其保存在大小为
我的问题是,我将ai_addr类型转换为sockaddr_storage
(struct sockaddr_storage *)(res->ai_addr)

并最终出现在gcc警告中:

warning: cast increases required alignment of target type



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

几个答案后更新:

问题在gcc警告上:
> warning: cast increases required alignment of target type

并通过以下方式解决:
(struct sockaddr_storage *)(void *)(res->ai_addr)

最佳答案

ai_addr只是一个指针。取决于ai_familyai_addr背后的实际结构有所不同:

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

  • 由于 sockaddr_insockaddr_in6sockaddr_storage( http://www.beej.us/guide/bgnet/output/html/multipage/sockaddr_inman.html)的结构,您可以如上所述根据 ai_family将指针强制转换为实际结构。

    关于c - sockaddr和IPv6地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817642/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com