青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Javen-Studio 咖啡小屋

http://javenstudio.org - C++ Java 分布式 搜索引擎
Naven's Research Laboratory - Thinking of Life, Imagination of Future

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  24 隨筆 :: 57 文章 :: 170 評論 :: 4 Trackbacks

IP 層的封裝

C++ 通用框架的設計 作者: naven

1?????????? IP 層封裝介紹

TCP/UDP 是網絡編程的基礎技術,分別代表面向連接的穩定的網絡通信技術和非連接方式的廣播形式的網絡通信技術,它們都建立在 IP 層之上,所以 IP 層的封裝尤為重要。 IP 層的封裝接口主要包括 DNS 的查詢、 IP 地址和域名的互查、本地 IP 及名字的查詢等,目前 IP 層使用的主要實現技術是 IPv4 ,但是未來會慢慢升級到容量更大的 IPv6 ,所以 IP 層的封裝需要要同時支持這兩種協議。操作系統實現它們都是通過增加新的 API 以及新的地址結構實現的,開發者編寫跨協議的網絡應用需要編寫較復雜的程序來區分 IPv4 IPv6 協議,優秀的 ACE 框架則通過條件編譯來支持 IPv6 ,好像不能同時在程序中使用 IPv4 IPv6 協議。本 C++ 框架參考 Java InetAddress 及相關類實現了類似跨協議的 IP 層封裝,編寫網絡應用基本不用考慮兩種協議的不同,應為它們對外的接口類都是 InetAddress ,另外同時提供了與 Java 一樣簡單的域名和 IP 地址互查的接口,使用非常容易。

?

主要有如下一些類

?

class AbstraceInetAddress ???????????????????????? IP 地址的抽象類,定義 IP 類的方法

class InetAddress?????????????????????????????????????????? 表示 IP 地址的接口類

class Inet4Address?? ?????????????????? ???????? 表示 IPv4 協議的 IP 地址實現類

class Inet6Address?? ?????????????????? ???????? 表示 IPv6 協議的 IP 地址實現類

class SocketAddress?????????????????? ??????????????????????????? 表示以域名 /IP/PORT 標識的網絡地址 Abstract

class InetSocketAddress???????????????????? 表示以域名 /IP/PORT 標識的網絡地址實現類

???????? class NameService????????????????????????????????????????? 內部使用的訪問域名服務的類

?

對于 IP 尋址,有如下幾個類: InetAddress Inet4Address Inet6Address 。 IPv4 的實現類 Inet4AddressImpl 使用一個 32 位的 unsignednumber 標識,一個 IPv4 地址形式為 nnn.nnn.nnn.nnn ,其中 n 為一個整數,例于 129.250.35.250 。而 IPv6 的實現類 Inet6AddressImpl 使用一個 128 位的 unsigned number 標識,形式如同 x:x:x:x:x:x:x:x ,其中 x 表示一個十六進制的數字,例于 1080:0:0:0:8:800:200C:417A 。

?

對于 Socket 尋址,有如下兩個類: SocketAddress InetSocketAddress 。其中 SocketAddress 是一個 abstract socket 地址,不依賴于一個特定的協議,它提供給實現特定協議的子類來使用。 InetSocketAddress SocketAddress 的一個子類,它表示一個 IP 類的 socket 地址,包括一個 IP 地址(如 129.250.35.250 )和端口(如 80 ),或者包括一個域名(如 coastnews.com )和一個端口(如 1000 ),或者僅僅包括一個端口(如 1010 )。

2?????????? Hello World!

下面的程序示例如何用上面的類進行 IP 查詢操作:

?

void ?main()?
{
????
// ?定義IP地址數組以存儲IP地址列表
????InetAddressArray?iaa;?
????
// ?調用InetAddress方法獲取此域名的所有IP,并存放到數組iaa中
???? int ?cnt? = ?InetAddress::getAllByName( " www.google.com " ,?iaa);?
????
????
// ?定義數組的迭代器
????InetAddressArray::iterator?it(iaa);?
????
// ?遍歷數組,列出所有IP地址
???? while (? ! it.done()?)? {
????????
// ?輸出IP地址的字符串形式
????????printf( " %s\n " ,?it -> getHostAddress().c_str());?
????????
// ?迭代器向前移一位
????????it.advance();?
????}

}

?

程序輸出如下:

?

66.102.7.99

66.102.7.104

66.102.7.147

?

3?????????? AbstractInetAddress

此類定義一個 Internet Procotol IP )地址類的接口,類定義如下:

?

?

class ?AbstractInetAddress?
{

protected :?
????
/* *?
?????*?Specify?the?address?family:?Internet?Protocol,?Version?4
?????*?@since?1.4
?????
*/

????
const ? static ? int ?IPv4? = ?INET_FAMILY_IPV4;

????
/* *?
?????*?Specify?the?address?family:?Internet?Protocol,?Version?6
?????*?@since?1.4
?????
*/

????
const ? static ? int ?IPv6? = ?INET_FAMILY_IPV6;

????
/* *?
?????*?Specify?address?family?preference?
?????
*/

????
static ?BOOL?preferIPv6Address;?
????
????
/* *?
?????*?Used?to?store?the?name?service?provider?
?????
*/

????
static ?NameService? & nameService;?

????
/* *?
?????*?Used?to?pointer?to?the?actual?address?implemented?
?????
*/

????
static ?InetAddressImplAutoPtr?_impl;?

????
virtual ?InetAddressAutoPtr?clone()? = ? 0 ;?

public :?
????
/* *
?????*?Destructor?must?implemented.?
?????
*/

????
virtual ? ~ AbstractInetAddress()? {} ?

????
/* *
?????*?Utility?routine?to?check?this?InetAddress.?
?????
*/

????
virtual ?BOOL?isMulticastAddress()? = ? 0 ;?
????
virtual ?BOOL?isAnyLocalAddress()? = ? 0 ;?
????
virtual ?BOOL?isLoopbackAddress()? = ? 0 ;?
????
virtual ?BOOL?isLinkLocalAddress()? = ? 0 ;?
????
virtual ?BOOL?isSiteLocalAddress()? = ? 0 ;?
????
virtual ?BOOL?isMCGlobal()? = ? 0 ;?
????
virtual ?BOOL?isMCNodeLocal()? = ? 0 ;?
????
virtual ?BOOL?isMCLinkLocal()? = ? 0 ;?
????
virtual ?BOOL?isMCSiteLocal()? = ? 0 ;?
????
virtual ?BOOL?isMCOrgLocal()? = ? 0 ;?

????
virtual ?SockAddr?getAddress()? = ? 0 ;?
????
virtual ?String?getHostAddress()? = ? 0 ;?
????
virtual ?BOOL?isUnresolved()? = ? 0 ;?

????
/* *
?????*?Compares?this?object?against?the?specified?object.
?????*?The?result?is?<code>true</code>?if?and?only?if?the?argument?is
?????*?not?<code>null</code>?and?it?represents?the?same?IP?address?as
?????*?this?object.
?????*?<p>
?????*?Two?instances?of?<code>InetAddress</code>?represent?the?same?IP
?????*?address?if?the?length?of?the?byte?arrays?returned?by
?????*?<code>getAddress</code>?is?the?same?for?both,?and?each?of?the
?????*?array?components?is?the?same?for?the?byte?arrays.
?????*
?????*?@param???obj???the?object?to?compare?against.
?????*?@return??<code>true</code>?if?the?objects?are?the?same;
?????*??????????<code>false</code>?otherwise.
?????
*/

????BOOL?equals(AbstractInetAddress?
& addr)?
????
{
????????
return ?getAddress()? == ?addr.getAddress()? ? ?TRUE?:?FALSE;?
????}


}
;

?

4?????????? InetAddress

此類實現一個 Internet Procotol IP )地址,一個 IP 地址即可以是用一個 32-bit unsigned 數來表示,也可以用一個 128-bit unsgined 數來表示,它內部實現了一個底層的協議如 UDP TCP 協議。 IP 地址的結構定義在 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 來構造,或者它是否已經做了 host name 決議的倒裝( reverse host name resolution )。

InetAddress 類的定義如下:

?

class ?InetAdress?:? public ?AbstractInetAddress
{
????
/* *
?????*?@serial
?????
*/

????String?_hostName;?

????
/* *
?????*?Specifies?the?address?family?type,?for?instance,?'1'?for?IPv4
?????*?addresses,?and?'2'?for?IPv6?addresses.
?????*
?????*?@serial
?????
*/

????
int ?_family;?

????
/* *?
?????*?Used?to?store?the?best?available?hostname?
?????
*/

????String?_canonicalHostName;?

????
/* *?
?????*?Used?to?pointer?to?the?actual?address?object?
?????
*/

????InetAddressAutoPtr?_ia;
}
;

?

?

5?????????? NameService

這個類實現一個名字服務的接口供 InetAddress 查詢 IP 及其協議類型使用,它有如下一些方法:

?

class ?NameService
{
????
/* *
?????*?The?gethostbyaddr?function?retrieves?the?host?information?
?????*?corresponding?to?a?network?address.
?????*?
?????*?Note??The?gethostbyaddr?function?has?been?deprecated?by?the?
?????*?introduction?of?the?getnameinfo?function.?Developers?creating?
?????*?socket?applications?are?urged?to?use?the?getnameinfo?function?
?????*?instead?of?the?gethostbyaddr?function.?See?Remarks.
?????
*/

????
int ?getHostByAddr(SockAddr? & addr,?String? & host);?

????
/* *
?????*?Lookup?hostname?in?name?service.?If
?????*?found?return?address?and?return?count,?-1?if?not?found.?
?????*
?????*?@param?host??host?name?to?lookup?
?????*?@param?addrs?return?the?address?list?that?found?
?????*?@return?found?addresses?count,?-1?if?not?found?or?error.?
?????
*/

????
int ?lookupAllHostAddr( const ?String? & host,?InetAddressArray? & addrs);?

????
/* *
?????*?Lookup?host?port?with?service?name?and?protocol?in?name?service.?If
?????*?found?return?port?and?return?count,?-1?if?not?found.?
?????*
?????*?@param?service??host?service?to?lookup?
?????*?@param?protocol?service?protocol,?default?is?"TCP"??
?????*?@return?host?port,?-1?if?not?found?or?error.?
?????
*/

????
int ?lookupHostPort( const ?String? & service,? const ?String? & protocol? = ? " TCP " );
}
;

?

?

6?????????? Inet4Adress

這個類實現一個 Internet Protocol version 4 (IPv4) 協議地址,定義在: 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

?

當四個部分都被指定后,每一個會被解釋為一個 assigned 字節的數據,從左到右,附值給一個四個字節的 IPv4 地址。此類的定義如下:

?

class ?Inet4Adress?:? public ?AbstractInetAddress
{
????
/* *
?????*?Holds?a?32-bit?IPv4?address.
?????*
?????*?@serial
?????
*/

????
int ?_address;

}
;

?

7?????????? Inet6Adress

這個類實現一個 Internet Protocol version 6 (IPv6) 協議地址,定義在: 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 進制數值,這是一個完整的格式,舉例如下:

?

1080:0:0:0:8:800:200C:417A

?

需要注意的是以 0 開始的欄位是無必要寫的,然而在每個欄位中必需有一個數字,除了如下描述的情形外:

由于一些分配了確定類型的 IPv6 地址的方法,它將為地址容納一個長的 zero bit strings 所共有,為了使得寫這些包含了 zero bit 的地址更容易,所以使用 :: ”來表示多個連續為 0 的欄位組,而“ :: ”在一個地址中只能出現一次,“ :: ”還能被用來壓縮一個地址中以 0 開始到 0 結尾的欄位組,例如:

?

1080::8:800:200C:417A

?

一種可替換的格式在有時候更為便利,但處理混合有 IPv4 IPv6 協議的節點如 x:x:x:x:x:x:d.d.d.d ,其中所有的“ x ”表示地址的 6 high-order 16-bit 部分的十六進制數,而其它的“ d ”表示標準的 IPv4 地址的 4 low-order 8-bit 部分的十進制數,例如:

?

::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 地址的非傳統的表示格式,

?

::255.255.0.d

?

其中的“ ::d ”符合一個通常的 IPv6 地址,如

?

0:0:0:0:0:0:0:d

?

對于一個需要返回文本格式的地址的方法, Inet6Address 將返回完整的格式,因為它是非常明確的,當在與其他文本數據結合使用的時候。

?

Inet6Address 類定義如下:

?

class ?Inet6Adress?:? public ?AbstractInetAddress
{
????
/* *?
?????*?cached?scope_id?-?for?link-local?address?use?only.
?????
*/

????
int ?_cached_scope_id;?

????
/* *
?????*?Holds?a?128-bit?(16?bytes)?IPv6?address.
?????*
?????
*/

????
int ?_ipaddress[ 16 ];
}
;

?

?

8?????????? SocketAddress 類和 InetSocketAddress

SocketAddress 類實現了一個不與任何一種協議綁定的 Socket 地址,它是一個抽象類,這表明必須使用它的綁定了特定協議的子類來表示 Socket 地址的實現。它為 sockets binding connecting 或者 return values 提供一個不可變的對象。

InetSocketAddress 類實現了一個 IP Socket Address (即一個 IP address 加一個 port 端口),它還能是一對 host name 加一個 port 端口,此時會嘗試去查找確定 host name 的實際地址。它的定義如下所示:

?

class ?InetSocketAddress?:? public ?SocketAddress?
{
????
/* *
?????*?The?hostname?of?the?Socket?Address
?????*?@serial
?????
*/
?????
????String?_hostname;?
????
????
/* *?
?????*?The?IP?address?of?the?Socket?Address
?????*?@serial
?????
*/

????InetAddress?_addr;?
????
????
/* *
?????*?The?port?number?of?the?Socket?Address
?????*?@serial
?????
*/
???
????
int ?_port;
}
;

?

?

?

C++ 通用框架的設計 作者: naven 日期: 2006-3-19

posted on 2006-03-19 12:54 Javen-Studio 閱讀(2963) 評論(4)  編輯 收藏 引用

評論

# re: IP層的封裝(Java的InetAddress類的C++實現) 2006-03-19 22:55 fiestay
看樣子還不錯,能否提供實現代碼?  回復  更多評論
  

# re: IP層的封裝(Java的InetAddress類的C++實現) 2006-04-17 10:54 Javen-Studio
等我有時間我先發布一個庫給大家試用看看,謝謝支持!  回復  更多評論
  

# re: IP層的封裝(Java的InetAddress類的C++實現) 2006-06-29 21:22 scott
please show us the missing source code. thnx  回復  更多評論
  

# re: IP層的封裝(Java的InetAddress類的C++實現) 2006-06-30 09:37 Javen-Studio
快了,我會發布一個windows下的試用版本
  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三区免费迷| 欧美人成免费网站| 日韩一级欧洲| 欧美国产欧美综合| 欧美在线影院| 亚洲一区二区欧美日韩| 91久久视频| 尤妮丝一区二区裸体视频| 国产精品丝袜白浆摸在线| 欧美日韩福利在线观看| 欧美va亚洲va国产综合| 午夜精品国产更新| 中文一区二区| 一区二区不卡在线视频 午夜欧美不卡' | 亚洲成人在线免费| 国产在线一区二区三区四区 | 欧美一区二区三区免费视| 日韩一级精品视频在线观看| 亚洲国产你懂的| 黄色日韩网站| 国产亚洲综合性久久久影院| 国产精品日韩精品欧美精品| 欧美手机在线视频| 欧美日韩性视频在线| 欧美激情精品久久久久久| 欧美成人中文字幕在线| 免费日韩成人| 免费久久久一本精品久久区| 久久综合久久综合这里只有精品| 久久高清国产| 久久国产主播精品| 久久精品首页| 久久米奇亚洲| 麻豆成人综合网| 狂野欧美激情性xxxx欧美| 美女成人午夜| 欧美高清自拍一区| 欧美.com| 欧美精品国产一区| 欧美午夜精品一区| 国产精品久久久一区二区三区 | 久久先锋资源| 美女视频黄a大片欧美| 欧美暴力喷水在线| 亚洲成人自拍视频| 亚洲毛片在线免费观看| 一本一本久久| 午夜视频久久久| 欧美一区二区在线免费观看| 久久久999精品视频| 久久在线播放| 欧美日韩国产在线一区| 国产精品久久久久久久久久直播 | 有坂深雪在线一区| 亚洲国内精品| 在线一区二区三区四区五区| 亚洲欧美在线看| 久久米奇亚洲| 欧美成人精品激情在线观看| 91久久夜色精品国产九色| 一区二区三区四区五区视频| 亚洲欧美日本国产有色| 久久人人爽人人爽爽久久| 欧美国产日韩视频| 国产精品久久久久久av下载红粉 | 欧美激情视频一区二区三区在线播放| 亚洲国产女人aaa毛片在线| 一区二区日韩精品| 久久成人人人人精品欧| 欧美成人一区二区三区| 国产精品美女久久久| 伊人蜜桃色噜噜激情综合| 一本综合久久| 久久精品一区蜜桃臀影院 | 一本色道久久综合精品竹菊| 久久国内精品自在自线400部| 欧美99久久| 国产老肥熟一区二区三区| 亚洲人成久久| 欧美在线视频免费播放| 欧美国产日韩精品免费观看| 亚洲天堂网在线观看| 久久中文字幕一区| 国产精品久久一卡二卡| 亚洲人成人77777线观看| 欧美一区二区三区免费观看| 欧美黑人一区二区三区| 午夜精品一区二区在线观看| 欧美激情按摩| 国内精品视频在线播放| 亚洲一区三区视频在线观看| 欧美成人资源网| 亚洲免费影院| 欧美日韩一区二区三区在线观看免 | 一区二区三区日韩精品| 久久久国产午夜精品| 国产精品美女xx| 99精品热视频只有精品10| 久久久久久久999精品视频| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲欧美日韩国产综合在线 | 久久综合精品一区| 国产热re99久久6国产精品| 99国产精品久久久久久久成人热| 久久久精品视频成人| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲日本一区二区| 玖玖综合伊人| 黄色日韩网站视频| 久久国产日韩欧美| 亚洲无玛一区| 欧美视频中文字幕在线| 99精品欧美一区二区三区综合在线| 狼人天天伊人久久| 性久久久久久| 国产欧美日韩中文字幕在线| 亚洲一区二区免费| 日韩一级片网址| 欧美日韩99| 日韩一级精品视频在线观看| 亚洲大片精品永久免费| 另类激情亚洲| 亚洲国产精品成人va在线观看| 老色批av在线精品| 久久久久欧美精品| 影音先锋成人资源站| 久久全球大尺度高清视频| 久久aⅴ国产欧美74aaa| 国产一区美女| 久久一区二区三区国产精品| 久久国产主播精品| 在线不卡亚洲| 你懂的网址国产 欧美| 麻豆精品在线观看| 亚洲人成亚洲人成在线观看| 亚洲风情在线资源站| 欧美激情一区二区三区高清视频 | 亚洲大胆人体视频| 欧美大尺度在线观看| 99精品久久| 一本色道久久综合亚洲精品不卡| 国产精品久久看| 久久高清福利视频| 久久久视频精品| 亚洲国产天堂久久综合网| 亚洲国产成人av好男人在线观看| 欧美激情亚洲另类| 亚洲综合欧美日韩| 亚洲欧美综合精品久久成人 | 嫩草伊人久久精品少妇av杨幂| 免费成人在线观看视频| 日韩午夜在线| 亚洲校园激情| 国产专区综合网| 亚洲国产精品久久人人爱蜜臀| 欧美日韩mp4| 性感少妇一区| 久久性天堂网| 一区二区三区免费网站| 亚洲欧美一区二区三区在线| 精品51国产黑色丝袜高跟鞋| 欧美国产综合| 国产精品国产三级国产a| 久久久噜噜噜久久中文字幕色伊伊| 久久躁日日躁aaaaxxxx| 一区二区三区精品在线| 欧美亚洲免费在线| 亚洲精品国久久99热| 亚洲已满18点击进入久久| 在线看片欧美| 夜夜嗨网站十八久久| 精品动漫一区| 99精品欧美一区二区三区| 国内外成人在线| 亚洲精品欧美激情| 国产亚洲福利社区一区| 最新日韩在线| 国模一区二区三区| 一本到高清视频免费精品| 韩国一区电影| 9色国产精品| 亚洲国产精品一区二区第一页| 亚洲午夜视频在线观看| 亚洲国产91| 亚洲欧美日韩在线播放| 亚洲免费大片| 久久精品国产综合精品| 亚洲欧美日韩国产中文| 欧美a级片网| 久久精品亚洲热| 欧美午夜剧场| 欧美国产高清| 国产一区二区高清不卡| 一本一道久久综合狠狠老精东影业 | 欧美在线高清视频| 欧美日韩免费看| 欧美二区不卡| 国产三级欧美三级| 一本色道久久| 日韩视频免费在线|