4. 從 IPv4 移植為 IPv6
「可是我只想知道要怎麼改程式碼的哪些地方就可以支援 IPv6 了!快點告訴我!」
OK!OK!
我幾乎都是以過來人的身分來講這邊的每件事,這次不考驗各位的耐心,來個簡潔的短文。(當然有更多比這篇短的文章,不過我是跟自己的這份文件來比較)。
首先,請試著用 getaddrinfo() 來取得 struct sockaddr 的資訊,取代手動填寫這個資料結構。這樣你就可以不用管 IP 的版本,而且能節省後續許多步驟。
找出全部與 IP 版本相關的任何程式碼,試著用一個有用的函式將它們包起來(wrap up)。
將 AF_INET 更改為 AF_INET6。
將 PF_INET 更改為 PF_INET6。
將 INADDR_ANY 更改為 in6addr_any,這裡有點不太一樣:
還有,在宣告 struct in6_addr 時,IN6ADDR_ANY_INIT 的值可以做為初始值,像這樣:
使用 struct sockaddr_in6 取代 struct sockaddr_in,確定要將 "6" 新增到適當的欄位[參考上面的 structs],但沒有 sin6_zero 欄位。
使用 struct in6_addr 取代 struct in_addr,要確定有將 "6" 新增到適當的欄位[參考上面的structs]。
使用 inet_pton() 取代 inet_aton() 或 inet_addr()。
使用 inet_ntop() 取代 inet_ntoa()。
使用很讚的 getaddrinfo() 取代 gethostbyname()。
使用很讚的 getnameinfo() 取代 gethostbyaddr()[雖然 gethostbyaddr()在 IPv6 中也能正常運作]。
不要用 INADDR_BROADCAST 了,請愛用 IPv6 multicast 來替代。
就是這樣。
譯註: IPv6 可參考萩野純一郎, IPv6 網路程式設計, 博碩, 2004.
Last updated