IPv6

提供: Wikinote
2009年6月9日 (火) 23:37時点におけるHagio (トーク | 投稿記録)による版 (構造体)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

IPv6 プログラミング

IPv6 プログラミングと言っても、IPv6 のみに対応したコードを書くのではなく、 アドレスファミリ (プロトコル) 独立なコードにすべきである。

その理由とは:

  • IPv4 と IPv6 の両方に対応した環境 (デュアルスタック環境) でうまく動くようにするため
  • これから登場するかもしれない様々なプロトコルに容易に対応できる
  • 様々な環境や OS に対応できる (移植性の向上)
  • コードがきれいでシンプルになる

構造体

各種構造体を列挙しておく。

"include/linux/socket.h"

struct sockaddr {
    sa_family_t sa_family;  /* address family, AF_xxx   */
    char        sa_data[14];    /* 14 bytes of protocol address */
};

#define sockaddr_storage __kernel_sockaddr_storage
/*
 * Desired design of maximum size and alignment (see RFC2553)
 */
#define _K_SS_MAXSIZE   128 /* Implementation specific max size */
#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *))
                /* Implementation specific desired alignment */

struct __kernel_sockaddr_storage {
    unsigned short  ss_family;      /* address family */
    /* Following field(s) are implementation specific */
    char        __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
                /* space to achieve desired size, */
                /* _SS_MAXSIZE value minus size of ss_family */
} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));   /* force desired alignment */

"include/linux/in6.h"

struct sockaddr_in6 {
    unsigned short int  sin6_family;    /* AF_INET6 */
    __u16           sin6_port;      /* Transport layer port # */
    __u32           sin6_flowinfo;  /* IPv6 flow information */
    struct in6_addr     sin6_addr;      /* IPv6 address */
    __u32           sin6_scope_id;  /* scope id (new in RFC2553) */
};

"glibc/resolv/netdb.h"

/* Structure to contain information about address of a service provider.  */
struct addrinfo
{
  int ai_flags;         /* Input flags.  */
  int ai_family;        /* Protocol family for socket.  */
  int ai_socktype;      /* Socket type.  */
  int ai_protocol;      /* Protocol for socket.  */
  socklen_t ai_addrlen;     /* Length of socket address.  */
  struct sockaddr *ai_addr; /* Socket address for socket.  */
  char *ai_canonname;       /* Canonical name for service location.  */
  struct addrinfo *ai_next; /* Pointer to next in list.  */
};

参考文献