我只是想了解getaddrinfo()行为。
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);由此产生的IP(v4/v6)处理保存在(每个) struct中的数据。
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
(struct sockaddr_storage *)(res->ai_addr)最后以gcc警告结束:
警告:强制转换增加目标类型所需的对齐。
将sockaddr类型转换为sockaddr_storage的正确方法是什么?
在几个答案之后更新:
问题是gcc警告:
> warning: cast increases required alignment of target type解决这一问题的办法是:
(struct sockaddr_storage *)(void *)(res->ai_addr)发布于 2014-07-18 07:33:23
ai_addr只是一个指针。根据ai_family,ai_addr背后的实际结构不同:
ai_family是AF_INET,那么它实际上是指向sockaddr_in结构的指针。ai_family是AF_INET6,则它是指向sockaddr_in6结构的指针。由于sockaddr_in、sockaddr_in6和sockaddr_storage (inman.html)的结构,您可以根据上面描述的ai_family来转换指向实际结构的指针。
发布于 2014-07-18 05:55:18
您应该使用sockaddr_storage作为套接字类型,因为它对IPv4和IPv6都足够大,并且可以转换为sockaddr。
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];
};https://stackoverflow.com/questions/24817642
复制相似问题