Nhưng tôi chỉ muốn biết phải đổi gì trong code để nó chạy được với IPv6! Nói luôn đi!
Được! Được!
Gần như mọi thứ ở đây đều là cái tôi đã nói ở phía trên, nhưng đây là phiên bản ngắn dành cho người không đủ kiên nhẫn. (Tất nhiên, còn nhiều hơn thế, nhưng đây là những gì áp dụng được trong phạm vi tài liệu này.)
Đầu tiên, cố gắng dùng getaddrinfo() để lấy toàn bộ thông tin struct sockaddr, thay vì đóng gói struct bằng tay. Làm vậy sẽ giữ cho code của bạn bất kể phiên bản IP, và cắt gọn được kha khá bước phía sau.
Chỗ nào bạn thấy mình đang hard-code thứ gì liên quan đến phiên bản IP, cố gắng gói lại trong một hàm trợ giúp.
Đổi AF_INET thành AF_INET6.
Đổi PF_INET thành PF_INET6.
Đổi các phép gán INADDR_ANY thành phép gán in6addr_any, có hơi khác một chút:
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 addressNgoài ra, giá trị IN6ADDR_ANY_INIT có thể dùng như một initializer khi khai báo struct in6_addr, như thế này:
struct in6_addr ia6 = IN6ADDR_ANY_INIT;Thay vì struct sockaddr_in, dùng struct sockaddr_in6, nhớ thêm “6” vào tên trường nếu cần (xem structs ở trên). Không có trường sin6_zero.
Thay vì struct in_addr, dùng struct in6_addr, nhớ thêm “6” vào tên trường nếu cần (xem structs ở trên).
Thay vì inet_aton() hoặc inet_addr(), dùng inet_pton().
Thay vì inet_ntoa(), dùng inet_ntop().
Thay vì gethostbyname(), dùng getaddrinfo() xịn hơn.
Thay vì gethostbyaddr(), dùng getnameinfo() xịn hơn (dù gethostbyaddr() vẫn chạy được với IPv6).
INADDR_BROADCAST không còn chạy nữa. Dùng IPv6 multicast thay thế.
Et voilà!