具体的には、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 つの値が同じではないのはなぜですか?
これは同じデータ (接続するアドレス) を指しているため、同じアドレスに配置する必要があります。それ以外の場合、IPv4 または IPv6 がわからない sockaddr_in で inet_ntop を呼び出すにはどうすればよいでしょうか?