IP
層的封裝
C++
通用框架的設(shè)計
作者:
naven
1??????????
IP
層封裝介紹
TCP/UDP
是網(wǎng)絡(luò)編程的基礎(chǔ)技術(shù),分別代表面向連接的穩(wěn)定的網(wǎng)絡(luò)通信技術(shù)和非連接方式的廣播形式的網(wǎng)絡(luò)通信技術(shù),它們都建立在
IP
層之上,所以
IP
層的封裝尤為重要。
IP
層的封裝接口主要包括
DNS
的查詢、
IP
地址和域名的互查、本地
IP
及名字的查詢等,目前
IP
層使用的主要實現(xiàn)技術(shù)是
IPv4
,但是未來會慢慢升級到容量更大的
IPv6
,所以
IP
層的封裝需要要同時支持這兩種協(xié)議。操作系統(tǒng)實現(xiàn)它們都是通過增加新的
API
以及新的地址結(jié)構(gòu)實現(xiàn)的,開發(fā)者編寫跨協(xié)議的網(wǎng)絡(luò)應(yīng)用需要編寫較復(fù)雜的程序來區(qū)分
IPv4
和
IPv6
協(xié)議,優(yōu)秀的
ACE
框架則通過條件編譯來支持
IPv6
,好像不能同時在程序中使用
IPv4
和
IPv6
協(xié)議。本
C++
框架參考
Java
的
InetAddress
及相關(guān)類實現(xiàn)了類似跨協(xié)議的
IP
層封裝,編寫網(wǎng)絡(luò)應(yīng)用基本不用考慮兩種協(xié)議的不同,應(yīng)為它們對外的接口類都是
InetAddress
,另外同時提供了與
Java
一樣簡單的域名和
IP
地址互查的接口,使用非常容易。
主要有如下一些類
class AbstraceInetAddress ???????????????????????? IP
地址的抽象類,定義
IP
類的方法
class InetAddress??????????????????????????????????????????
表示
IP
地址的接口類
class Inet4Address?? ?????????????????? ????????
表示
IPv4
協(xié)議的
IP
地址實現(xiàn)類
class Inet6Address?? ?????????????????? ????????
表示
IPv6
協(xié)議的
IP
地址實現(xiàn)類
class SocketAddress?????????????????? ???????????????????????????
表示以域名
/IP/PORT
標(biāo)識的網(wǎng)絡(luò)地址
Abstract
類
class InetSocketAddress????????????????????
表示以域名
/IP/PORT
標(biāo)識的網(wǎng)絡(luò)地址實現(xiàn)類
???????? class NameService?????????????????????????????????????????
內(nèi)部使用的訪問域名服務(wù)的類
對于
IP
尋址,有如下幾個類:
InetAddress
、
Inet4Address
和
Inet6Address
。
IPv4
的實現(xiàn)類
Inet4AddressImpl
使用一個
32
位的
unsignednumber
標(biāo)識,一個
IPv4
地址形式為
nnn.nnn.nnn.nnn
,其中
n
為一個整數(shù),例于
129.250.35.250
。而
IPv6
的實現(xiàn)類
Inet6AddressImpl
使用一個
128
位的
unsigned number
標(biāo)識,形式如同
x:x:x:x:x:x:x:x
,其中
x
表示一個十六進(jìn)制的數(shù)字,例于
1080:0:0:0:8:800:
對于
Socket
尋址,有如下兩個類:
SocketAddress
和
InetSocketAddress
。其中
SocketAddress
是一個
abstract
的
socket
地址,不依賴于一個特定的協(xié)議,它提供給實現(xiàn)特定協(xié)議的子類來使用。
InetSocketAddress
是
SocketAddress
的一個子類,它表示一個
IP
類的
socket
地址,包括一個
IP
地址(如
129.250.35.250
)和端口(如
80
),或者包括一個域名(如
coastnews.com
)和一個端口(如
1000
),或者僅僅包括一個端口(如
1010
)。
2??????????
Hello World!
下面的程序示例如何用上面的類進(jìn)行
IP
查詢操作:






















?
程序輸出如下:
66.102.7.99
66.102.7.104
66.102.7.147
3??????????
AbstractInetAddress
類
此類定義一個
Internet Procotol
(
IP
)地址類的接口,類定義如下:





























































































?
4??????????
InetAddress
類
此類實現(xiàn)一個
Internet Procotol
(
IP
)地址,一個
IP
地址即可以是用一個
32-bit
的
unsigned
數(shù)來表示,也可以用一個
128-bit
的
unsgined
數(shù)來表示,它內(nèi)部實現(xiàn)了一個底層的協(xié)議如
UDP
和
TCP
協(xié)議。
IP
地址的結(jié)構(gòu)定義在
RFC790 Assigned Numbers
:
http://www.ietf.org/rfc/rfc790.txt
,
RFC1918 Address Allocation for Private Internets
:
http://www.ietf.org/rfc/rfc1918.txt
,
RFC2365 Administratively Scoped IP Multicast
:
http://www.ietf.org/rfc/rfc2365.txt
,
RFC2373 Version 6 Addressing Architecture
:
http://www.ietf.org/rfc/rfc2373.txt
。一個
InetAddress
的實體由一個
IP
地址和一個可能它通訊的
host name
組成,這個
host name
依賴于它是否使用一個
host name
來構(gòu)造,或者它是否已經(jīng)做了
host name
決議的倒裝(
reverse host name resolution
)。
InetAddress
類的定義如下:
































?
5??????????
NameService
類
這個類實現(xiàn)一個名字服務(wù)的接口供
InetAddress
查詢
IP
及其協(xié)議類型使用,它有如下一些方法:







































?
6??????????
Inet4Adress
類
這個類實現(xiàn)一個
Internet Protocol version 4 (IPv4)
協(xié)議地址,定義在:
RFC790 Assigned Numbers
:
http://www.ietf.org/rfc/rfc790.txt
,
RFC1918 Address Allocation for Private Internets
:
http://www.ietf.org/rfc/rfc1918.txt
,
RFC2365 Administratively Scoped IP Multicast
:
http://www.ietf.org/rfc/rfc2365.txt
。一個
IPv4
地址的文本表示法使用如下一個格式輸入:
d.d.d.d
d.d.d
d.d
d
當(dāng)四個部分都被指定后,每一個會被解釋為一個
assigned
字節(jié)的數(shù)據(jù),從左到右,附值給一個四個字節(jié)的
IPv4
地址。此類的定義如下:














?
7??????????
Inet6Adress
類
這個類實現(xiàn)一個
Internet Protocol version 6 (IPv6)
協(xié)議地址,定義在:
RFC2373 IP Version 6 Addressing Architecture
:
http://www.ietf.org/rfc/rfc2373.txt
。一個
IPv6
地址的文本表示法使用如下一個格式輸入:
首選的格式是
x:x:x:x:x:x:x:x
,其中所有的“
x
”是表示地址的
8
個
16-bit
塊的
16
進(jìn)制數(shù)值,這是一個完整的格式,舉例如下:
1080:0:0:0:8:800:
需要注意的是以
0
開始的欄位是無必要寫的,然而在每個欄位中必需有一個數(shù)字,除了如下描述的情形外:
由于一些分配了確定類型的
IPv6
地址的方法,它將為地址容納一個長的
zero bit
的
strings
所共有,為了使得寫這些包含了
zero bit
的地址更容易,所以使用
“
::
”來表示多個連續(xù)為
0
的欄位組,而“
::
”在一個地址中只能出現(xiàn)一次,“
::
”還能被用來壓縮一個地址中以
0
開始到
0
結(jié)尾的欄位組,例如:
1080::8:800:
一種可替換的格式在有時候更為便利,但處理混合有
IPv4
和
IPv6
協(xié)議的節(jié)點如
x:x:x:x:x:x:d.d.d.d
,其中所有的“
x
”表示地址的
6
個
high-order 16-bit
部分的十六進(jìn)制數(shù),而其它的“
d
”表示標(biāo)準(zhǔn)的
IPv4
地址的
4
個
low-order 8-bit
部分的十進(jìn)制數(shù),例如:
::FFFF:129.144.52.38
::129.144.52.38
其中“
::FFFF:d.d.d.d
”和“
::d.d.d.d
”分別地表示一個
IPv4-mapped IPv6
地址和一個
IPv4-compatible IPv6
地址,需要注意的是
IPv4
部分必須是
“
d.d.d.d
”格式,以下的格式都是不正確的:
::FFFF:d.d.d
::FFFF:d.d
::d.d.d
::d.d
但是下面的格式卻是合法的:
::FFFF:d
然而它是一個表示
IPv4-compatible IPv6
地址的非傳統(tǒng)的表示格式,
::255.255.0.d
其中的“
::d
”符合一個通常的
IPv6
地址,如
0:0:0:0:0:0:0:d
對于一個需要返回文本格式的地址的方法,
Inet6Address
將返回完整的格式,因為它是非常明確的,當(dāng)在與其他文本數(shù)據(jù)結(jié)合使用的時候。
Inet6Address
類定義如下:


















?
8??????????
SocketAddress
類和
InetSocketAddress
類
SocketAddress
類實現(xiàn)了一個不與任何一種協(xié)議綁定的
Socket
地址,它是一個抽象類,這表明必須使用它的綁定了特定協(xié)議的子類來表示
Socket
地址的實現(xiàn)。它為
sockets
的
binding
和
connecting
或者
return values
提供一個不可變的對象。
InetSocketAddress
類實現(xiàn)了一個
IP Socket Address
(即一個
IP address
加一個
port
端口),它還能是一對
host name
加一個
port
端口,此時會嘗試去查找確定
host name
的實際地址。它的定義如下所示:


























?
C++
通用框架的設(shè)計
作者:
naven
日期: