4 IPv4 から IPv6 へのジャンプ
しかし、IPv6 で動作させるためには、私のコードのどこを変えればいいのか知りたいのです!今すぐ教えてください!
Ok! Ok!
ここに書かれていることはほとんどすべて、私が上で説明したことですが、せっかちな人のためのショートバージョンです。(もちろん、これ以外にもありますが、このガイドに該当するのはこれです。)
-
まず、構造体を手動で詰めるのではなく、
getaddrinfo()
を使ってすべてのstruct sockaddr
の情報を取得するようにしてください。こうすることで、IP のバージョンに左右されず、また、その後の多くのステップを省くことができます。 -
IP バージョンに関連する何かをハードコーディングしていることが分かったら、ヘルパー関数でラップするようにします。
-
AF_INET
をAF_INET6
に変更します。 -
PF_INET
をPF_INET6
に変更します。 -
INADDR_ANY
の割り当てをin6addr_any
の割り当てに変更し、若干の差異が生じます。struct sockaddr_in sa; struct sockaddr_in6 sa6; sa.sin_addr.s_addr = INADDR_ANY; // use my IPv4 address sa6.sin6_addr = in6addr_any; // use my IPv6 address
また、
IN6ADDR_ANY_INIT
という値は、struct in6_addr
を宣言する際にイニシャライザーとして以下のように使用することができます。struct in6_addr ia6 = IN6ADDR_ANY_INIT;
-
struct sockaddr_in
の代わりにstruct sockaddr_in6
を使用し、必要に応じてフィールドに "6" を追加してください(上記の 構造体の章を参照)。sin6_zero
フィールドはありません。 -
struct in_addr
の代わりにstruct in6_addr
を使用し、必要に応じてフィールドに "6" を追加してください(上記の 構造体の章を参照)。 -
inet_aton()
やinet_addr()
の代わりに、inet_apton()
を使用してください。 -
inet_ntoa()
の代わりにinet_ntop()
を使用してください。 -
gethostbyname()
の代わりに、優れたgetaddrinfo()
を使用してください。 -
gethostbyaddr()
の代わりに、優れたgetnameinfo()
を使用してください(gethostbyaddr()
は IPv6 でも動作可能です)。 -
INADDR_BROADCAST
は動作しなくなりました。代わりに IPv6 マルチキャストを使用してください。
出来上がり!