「IPv6」の版間の差分

提供: Wikinote
移動: 案内検索
(新しいページ: ' == IPv6 プログラミング == IPv6 プログラミングと言っても、IPv6 のみに対応したコードを書くのではなく、 アドレスファミリ (プロ...')
 
(構造体)
 
(同じ利用者による、間の1版が非表示)
行12: 行12:
 
* コードがきれいでシンプルになる
 
* コードがきれいでシンプルになる
  
 +
=== 構造体 ===
  
=== 参考文献 ===
+
各種構造体を列挙しておく。
 +
 
 +
"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.  */
 +
};
 +
 
 +
== 参考文献 ==
 
* [http://www.amazon.co.jp/dp/4756142362/hagio.org-22 IPv6 ネットワークプログラミング] 今は亡き itojun 氏の著作だったとは、借りた後に気づいた。
 
* [http://www.amazon.co.jp/dp/4756142362/hagio.org-22 IPv6 ネットワークプログラミング] 今は亡き itojun 氏の著作だったとは、借りた後に気づいた。

2009年6月9日 (火) 23:37時点における最新版

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

参考文献