筑波大学 システム情報系 情報工学域
新城 靖
<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 がある。