回精華區
作者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
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻