4. 從 IPv4 移植為 IPv6

"可是我只想知道要怎麼改程式碼的哪些地方就可以支援 IPv6 了!快點告訴我!"

OK!OK!

我幾乎都是以過來人的身分來講這邊的每件事,這次不考驗各位的耐心,來個簡潔的短文。[當然有更多比這篇短的文章,不過我是跟自己的這份文件來比較]。

1. 首先,請試著用 getaddrinfo() 來取得 struct sockaddr 的資訊,取代手動填寫這個資料結構。這樣你就可以不用管IP的版本,而且能節省之後的很多步驟。

2. 找出全部與 IP 版本相關的任何程式碼,試著用一個有用的函式將它們包起來(wrap up)。

3. 將 AF_INET 更改為 AF_INET6。

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 位址

還有,在宣告 struct in6_addr 時,IN6ADDR_ANY_INIT 的值可以做為初始值,像這樣:

struct in6_addr ia6 = IN6ADDR_ANY_INIT;


6. 使用 struct sockaddr_in6 取代 struct sockaddr_in,確定要將"6"新增到適當的欄位[參考上面的 structs],但沒有 sin6_zero 欄位。

7. 使用 struct in6_addr 取代 struct in_addr,要確定有將"6"新增到適當的欄位[參考上面的structs]。

8. 使用 inet_pton() 取代 inet_aton() 或 inet_addr()。

9. 使用 inet_ntop() 取代 inet_ntoa()。

10. 使用很讚的 getaddrinfo() 取代 gethostbyname()。

11. 使用很讚的 getnameinfo() 取代 gethostbyaddr()[雖然 gethostbyaddr()在 IPv6 中也能正常運作]。

12. 不要用 INADDR_BROADCAST 了,請愛用 IPv6 multicast 來替代。

就是這樣。

譯註:
IPv6 可參考萩野純一郎, IPv6 網路程式設計, 博碩, 2004.