システムプログラム(第7回): sockaddrの構造

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

Socketのアドレスのクラス階層

Socket API で使われる struct sockaddr は、オブジェクト指向的に作られて いる。 Socket API には、struct sockaddr と書かれていても、プログラムの中で実際 に使う時には、struct sockaddr_in, struct sockaddr_in6, struct sockaddr_un を使う。

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 がある。
Last updated: 2021/05/22 11:02:50
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>