Я просто пытаюсь понять поведение getaddrinfo().sockaddr и адрес IPv6
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, размер которого < адрес IPv6.
Моя проблема в том, что я типа литья ai_addr для sockaddr_storage
(struct sockaddr_storage *)(res->ai_addr)
И в конечном итоге в предупреждении GCC:
предупреждение: литые увеличивается требуемое выравнивание целевого типа
Каков правильный способ приведения типа sockaddr в sockaddr_storage?
Update после нескольких ответов:
Вопрос был на предупреждение GCC:
> warning: cast increases required alignment of target type
И она решается с:
(struct sockaddr_storage *)(void *)(res->ai_addr)
Надеюсь, вы прочли это все, что мне когда-либо нужно было знать http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#lowlevel – MarkAWard