4 IPv4 から IPv6 へのジャンプ

しかし、IPv6 で動作させるためには、私のコードのどこを変えればいいのか知りたいのです!今すぐ教えてください!

Ok! Ok!

ここに書かれていることはほとんどすべて、私が上で説明したことですが、せっかちな人のためのショートバージョンです。(もちろん、これ以外にもありますが、このガイドに該当するのはこれです。)

  1. まず、構造体を手動で詰めるのではなく、getaddrinfo() を使ってすべての struct sockaddr の情報を取得するようにしてください。こうすることで、IP のバージョンに左右されず、また、その後の多くのステップを省くことができます。

  2. IP バージョンに関連する何かをハードコーディングしていることが分かったら、ヘルパー関数でラップするようにします。

  3. AF_INETAF_INET6 に変更します。

  4. PF_INETPF_INET6 に変更します。

  5. 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;
    
  6. struct sockaddr_in の代わりに struct sockaddr_in6 を使用し、必要に応じてフィールドに "6" を追加してください(上記の 構造体の章を参照)。sin6_zero フィールドはありません。

  7. struct in_addr の代わりに struct in6_addr を使用し、必要に応じてフィールドに "6" を追加してください(上記の 構造体の章を参照)。

  8. inet_aton()inet_addr() の代わりに、inet_apton() を使用してください。

  9. inet_ntoa() の代わりに inet_ntop() を使用してください。

  10. gethostbyname() の代わりに、優れた getaddrinfo() を使用してください。

  11. gethostbyaddr() の代わりに、優れた getnameinfo() を使用してください(gethostbyaddr() は IPv6 でも動作可能です)。

  12. INADDR_BROADCAST は動作しなくなりました。代わりに IPv6 マルチキャストを使用してください。

出来上がり!