Разве struct sockadr_in не должна работать как для IPv4, так и для IPv6?
В частности, sin_addr находится в разных местах памяти для адресов IPv4 и IPv6. Это приводит к странности:
#include <stdio.h>
#include <netinet/in.h>
int main(int argc, char ** argv) {
struct sockaddr_in sa;
printf("sin_addr in sockaddr_in = %p\n", &sa.sin_addr);
printf("sin_addr in sockaddr_in6 = %p\n", &((struct sockaddr_in6*)&sa)->sin6_addr);
};
Выход:
sin_addr in sockaddr_in = 0x7fffa26102b4
sin_addr in sockaddr_in6 = 0x7fffa26102b8
Почему эти 2 значения не совпадают?
Поскольку это указывает на одни и те же данные (адрес для подключения), они должны быть расположены по тому же адресу. В противном случае, как вы должны вызывать inet_ntop с sockaddr_in, который вы не знаете, IPv4 или IPv6?