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 マルチキャストを使用してください。
出来上がり!