筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2013/2013-05-22
/sockaddr.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2013/
http://www.coins.tsukuba.ac.jp/~yas/
TCP/IP (IPv4) の場合、アドレスの指定には、sockaddr_in 構造体を使う。connect() システムコールのマニュアルには、sockaddr 構造体を使うようにと書かれて いるが、TCP/IP では、そのサブクラス(オブジェクト指向用語)である sockaddr_in を使う。それには、 IP アドレスとポート番号が必要である。 その他に、sockaddr 構造体のサブクラスの中でも sockaddr_in であることを 示す定数 AF_INET が先頭に現れる。
/usr/include/sys/socket.h:
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) */ };
typedef __uint32_t in_addr_t; /* base type for internet address */ ... typedef __uint16_t in_port_t; ... 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]; /* XXX bwg2001-004 */ };
/usr/include/netinet6/in6.h: 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 */ }; 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 */ };
/usr/include/sys/un.h: struct sockaddr_un { unsigned char sun_len; /* sockaddr len including null */ sa_family_t sun_family; /* [XSI] AF_UNIX */ char sun_path[104]; /* [XSI] path name (gag) */ };
/usr/include/sys/socket.h: /* * RFC 2553: protocol-independent placeholder for socket addresses */ #define _SS_MAXSIZE 128 #define _SS_ALIGNSIZE (sizeof(__int64_t)) #define _SS_PAD1SIZE \ (_SS_ALIGNSIZE - sizeof(__uint8_t) - sizeof(sa_family_t)) #define _SS_PAD2SIZE \ (_SS_MAXSIZE - sizeof(__uint8_t) - sizeof(sa_family_t) - \ _SS_PAD1SIZE - _SS_ALIGNSIZE) /* * [XSI] sockaddr_storage */ struct sockaddr_storage { __uint8_t ss_len; /* address length */ sa_family_t ss_family; /* [XSI] address family */ char __ss_pad1[_SS_PAD1SIZE]; __int64_t __ss_align; /* force structure storage alignment */ char __ss_pad2[_SS_PAD2SIZE]; };