К содержанию

Но я просто хочу знать, что мне изменить в своём коде, чтобы использовать IPv6!

Хорошо, хорошо!

Почти всё, что нужно, я уже развёрнуто описал выше, но вот вам и короткая версия для нетерпеливых.

1. Во-первых, попытайтесь использовать getaddrinfo() для получение всей необходимой информации для struct sockaddr вместо того, чтобы вручную заполнять данные. Это позволит быть сохранять независимость от версии протокола IP и избежать многих лишних действий.
2. В любом месте, где ваш написаный вручную код зависим от версии протокола IP, попробуйте заменить его на функцию-помошника.
3. Замените AF_INET на AF_INTET6
4. Замените PF_INET на PF_INET6
5. Замените присвоения INADDR_ANY на in6addr_any, это немного сложнее выглядит:

struct sockaddr_in sa;
struct sockaddr_in6 sa6;sa.sin_addr.s_addr = INADDR_ANY;  // используем IPv4
sa6.sin6_addr = in6addr_any; // используем IPv6

 

Кроме того, IN6ADDR_ANY_INIT может быть использовано как инициализатор, когда обьявляется struct in6_addr, вот так:

struct in6_addr ia6 = IN6ADDR_ANY_INIT;

 

6. Вместо struct sockaddr_in используйте struct sockaddr_in6, убедившись в соответствии всех полей (см. раздел структуры. Не существует поля sin6_zero.
7. Вместо struct in_addr используйте struct in6_addr, убедившись в соответствии всех полей (см. раздел структуры.
8. Вместо inet_aton() или inet_addr() используйте inet_pton
9. Вместо inet_ntoa() используйте inet_ntop()
10. Вместо gethostbyname() используйте getaddrinfo()
11. Вместо gethostbyaddr() используйте getnameinfo() (хотя gethostbyaddr() всё же может работать с ipv6).
12. INADD_BROADCAST больше не работает. Вместо него используйте IPv6 Multicast.

И вуаля!

К содержанию