筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2021/2021-06-02/sockaddr-struct.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2021/
http://www.coins.tsukuba.ac.jp/~yas/
YHM_Sub_Section(sockaddr-root,struct sockaddr)
typedef unsigned char __uint8_t; typedef __uint8_t sa_family_t; struct sockaddr { __uint8_t sa_len; /* total length */ sa_family_t sa_family; /* [XSI] address family */ char sa_data[14]; /* [XSI] addr value (actually larger) */ };この構造体は、全体で16バイトであるが、先頭の sa_len 1バイトと、次の sa_family 1バイトだけがアクセスされる。実際には、この構造体でmalloc() されることはない。 YHM_Sub_Section(sockaddr_in,struct sockaddr_in)
/usr/include/netinet/in.h: typedef unsigned short __uint16_t; typedef __uint16_t in_port_t; typedef unsigned int __uint32_t; typedef __uint32_t in_addr_t; /* base type for internet address */ struct in_addr { in_addr_t s_addr; }; struct sockaddr_in { __uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; };先頭の sin_len 1バイトと、次の sin_family 1バイトは、struct sockaddr と 共通である。残りの部分に IPv4 の IP アドレス struct in_addr sin_addr と ポート番号 sin_port がある。 YHM_Sub_Section(in_addr,struct in_addr) struct in_addr は、struct sockaddrに示したよ うに、最終的には unsigned int である。ただし、 バイトオーダー は、ネットワーク・バイト・オーダー、すなわち、ビッグエンディアンに なっており、下位番地に上位バイトを置く。 下位番地に下位バイトを置く。 あり、x86 等のリトルエンディアンの アーキテクチャを持つ CPU ではそのまま解釈できない。 YHM_Sub_Section(sockaddr_in6,struct sockaddr_in6)
/usr/include/netinet6/in6.h typedef struct in6_addr { union { __uint8_t __u6_addr8[16]; __uint16_t __u6_addr16[8]; __uint32_t __u6_addr32[4]; } __u6_addr; /* 128-bit IP6 address */ } in6_addr_t; struct sockaddr_in6 { __uint8_t sin6_len; /* length of this struct(sa_family_t) */ sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */ in_port_t sin6_port; /* Transport layer port # (in_port_t) */ __uint32_t sin6_flowinfo; /* IP6 flow information */ struct in6_addr sin6_addr; /* IP6 address */ __uint32_t sin6_scope_id; /* scope zone index */ };先頭の sin6_len 1バイトと、次の sin6_family 1バイトは、struct sockaddr と 共通である。残りの部分に IPv6 の IP アドレス struct in6_addr sin6_addr と ポート番号 sin6_port がある。