O struct sockadr_in não deveria funcionar tanto para IPv4 quanto para IPv6?

Especificamente, sin_addr parece estar localizado em locais de memória diferentes para o soquete IPv4 e IPv6 endereçados. Isso resulta em estranheza:

#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);            
};

Saída:

sin_addr in sockaddr_in  = 0x7fffa26102b4
sin_addr in sockaddr_in6 = 0x7fffa26102b8

Por que esses dois valores não são os mesmos?

Como isso está apontando para os mesmos dados (o endereço para se conectar), isso deve estar localizado no mesmo endereço. Caso contrário, como você deve chamar inet_ntop com um sockaddr_in que você não conhece é IPv4 ou IPv6?

questionAnswers(2)

yourAnswerToTheQuestion