Разве 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?

Ответы на вопрос(2)

Ваш ответ на вопрос