筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
https://www.coins.tsukuba.ac.jp/~syspro/2024/2024-07-03/sockaddr.html
あるいは、次のページから手繰っていくこともできます。
https://www.coins.tsukuba.ac.jp/~syspro/2024/
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 unsigned short int sa_family_t; struct sockaddr { sa_family_t sa_family; char sa_data[14]; };
typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; typedef uint16_t in_port_t; struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[sizeof (struct sockaddr) - (sizeof (unsigned short int)) - sizeof (in_port_t) - sizeof (struct in_addr)]; };
/usr/include/netinet/in.h: struct in6_addr { union { uint8_t __u6_addr8[16]; uint16_t __u6_addr16[8]; uint32_t __u6_addr32[4]; } __in6_u; }; struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; };
/usr/include/sys/un.h: struct sockaddr_un { sa_family_t sun_family; char sun_path[108]; };
/usr/include/sys/socket.h: struct sockaddr_storage { sa_family_t ss_family; char __ss_padding[(128 - (sizeof (unsigned short int)) - sizeof (unsigned long int))]; unsigned long int __ss_align; };
TCP/IP (IPv4) の場合、アドレスの指定には、sockaddr_in 構造体を使う。connect() システムコールのマニュアルには、sockaddr 構造体を使うようにと書かれて いるが、TCP/IP では、そのサブクラス(オブジェクト指向用語)である sockaddr_in を使う。それには、 IP アドレスとポート番号が必要である。 その他に、sockaddr 構造体のサブクラスの中でも sockaddr_in であることを 示す定数 AF_INET が(lenの次)に現れる。
/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 smaller or larger) */ };
typedef __uint32_t in_addr_t; 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]; };
/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 */ };
/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) 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]; };