作者sby.bbs@bbs.csie.mcu.edu.tw (不知不覺就天亮了), 看板: installbbs
標題[文件] IPv6 BBS -- 讓 IPv4 與 IPv6 共存 --
時間銘傳大學資工神話 (Fri May 30 01:11:17 2003) Updated: 2003/05/30
[前言]
小弟一時興起把 BBS 改成 IPv6 相容, 測試了幾天...大致上應該沒什麼問題...
由於之前好像沒看過類似的文章, 就來獻醜一下, 大家有興趣的話可以參考看看,
內容如有疑問歡迎來信指正 :)
Bor-Yeh Shen (sby@cs.mcu.edu.tw)
[關於 OS 的支援]
要讓 BBS 同時提供 IPv4 和 IPv6, OS 一定要有支援才行, 值得高興的是,
現在許多 OS 都有提供 IPv4/IPv6 dual stack (Linux, BSD, Windows, ...)
只是看有沒有 enable 起來, 關於這方面的內容網路上有許多文件可以參考,
就不在本篇的討論範圍之內.
[socket 位址結構的轉換]
第一步需要將所有 IPv4 socket address 轉換成 IPv6,
(不必擔心 IPv4 Address 會有不合的問題, 因為 IPv6 在設計時就有考量到,
系統會自己將 IPv4 Address mapped 到 IPv6 Address)
ex:
sockaddr_in 改成 sockaddr_in6, xxx.sin_len 改成 xxx.sin6_len, ...etc.
當然, 如果您的 BBS 有在做 release 的話, 為了避免使用的系統不支援 IPv6,
#ifdef ... #else ... #endif 應該是免不了的 :)
以下是 IPv4 和 IPv6 socket address 的結構, 對應著轉換就好:
/* IPv4 socket address structure */
struct sockaddr_in {
u_char sin_len; /* length of this struct */
u_char sin_family; /* AF_INET */
u_short sin_port; /* Transport layer port # */
struct in_addr sin_addr; /* IP4 address */
char sin_zero[8]; /* unused */
};
/* IPv6 socket address structure */
struct sockaddr_in6 {
u_int8_t sin6_len; /* length of this struct */
u_int8_t sin6_family; /* AF_INET6 */
u_int16_t sin6_port; /* Transport layer port # */
u_int32_t sin6_flowinfo; /* IP6 flow information */
struct in6_addr sin6_addr; /* IP6 address */
u_int32_t sin6_scope_id; /* scope zone index */
};
[Address Family 的變更]
由 AF_INET 改成 AF_INET6
[Protocal Family 的變更]
由 PF_INET 改成 PF_INET6
[IP 正反解部分]
在做 IPv6 的轉換時, 通常會建議用 getaddrinfo(), getnameinfo() 取代
原有的 gethostbyname(), gethostbyaddr() 等呼叫, 這兩個函式會把
所有與 IPv4 & IPv6 協定相關的動作隱藏起來, 如此一來我們不需要在乎
現在使用的到底是 IPv4 or IPv6, 程式也會變得較簡潔一些,
詳細的用法可以參考 man page, 裡面寫的蠻清楚的 :)
(跟前面比起來, 這邊算是更動比較大的部分)
[其它]
因為 IPv6 字串長度最長是 INET6_ADDRSTRLEN (46),
所以 BBS 紀錄上站來源的地方可能需要要改一下
(如果不夠長的話也許要更動原有的結構)
其它應該就沒什麼需要改的地方了....(至少我現在的感覺是如此:p)
hmm....大致上是這樣....還有問題的地方可以再一起來討論看看 :)
--
另外, 神話目前的 IPv6 Address 是 3ffe:3600:1e::2bf
也歡迎大家來參觀參觀....^^
--
※ Origin: 銘傳資工神話站 <bbs.csie.mcu.edu.tw>
※ From : 3ffe:3600:1e::2af