Class_Page_Header(Class_Root()No6_files/sockaddr.html,6,sockaddr構造)

sockaddr構造

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) */
};

struct sockaddr_in

IPv4。IPアドレスは、32ビット(4バイト)。ポート番号は、16ビット(2バイト)。 /usr/include/netinet/in.h:
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 */
};

struct sockaddr_in6

IPv6。IPアドレスは、128ビット(16バイト)。ポート番号は、16ビット(2バイト)。
/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 */
};

struct sockaddr_un

Unix ドメインのソケット。 ファイル名を使って通信相手を識別する。
/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) */
};

struct sockaddr_storage

recvfrom() など、受信時にバイト数が不明の時に使う。
/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];
};


Last updated: 2007/05/22 13:10:47
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>