例項解析IPv6下的VC網路程式設計2

2021-04-06 11:46:34 字數 3055 閱讀 6335

例項解析ipv6下的vc網路程式設計2

例項篇ipv6程式相對於ipv4改動並不大。其中主要的改動就是位址結構與位址解析函式。在rfc中詳細說明了socket api 為適應ipv6所做的改動。而且windows平台與linux平台在實現上也幾乎是一樣的。只不過標頭檔案與支援程度等有所不同罷了(具體請參見rfc 2553與rfc 2292)。如讀者有興趣的話可以找rfc來看看,在這裡就不再詳細說明,只講最簡單的原理與例子,同時例出各主要socket api,如何使用,可以參考msdn或是linux中的man。

位址表示

ipv4使用32bits的位址表示,並有sockaddr_in和in_addr等結構應用於api中,而ipv6 使用128 bits 位址,也定義了本身的位址結構sockaddr_in6和in6_addr。

struct sockaddr_in ;

struct in_addr

struct sockaddr_in6

struct in6_addr

ip v4/ip v6專用函式

ipv6 api中一部分沿用了ipv4 api, 也新增了一些ipv6專用api,為使得程式具有更大的通用性,盡量避免使用ipv4專用函式,這些函式如下:

ip v4專用 是對應的ip v4/v6通用函式 功能說明

inet_aton( ) inet_ntop( ) 字串位址轉為ip位址

inet_ntoa( ) inet_pton( ) ip位址轉為字串位址

gethostbyname( ) getipnodebyname( ) 由名字獲得ip地

gethostbyaddr( ) struct hostent *getipnodebyaddr( ) ip位址獲得名字

getaddrinfo( ) 獲得全部位址資訊

getnameinfo( ) 獲得全部名字資訊

未發生變化的函式 功能說明

socket( ) 建立socket

bind( ) socket與位址繫結

send( ) 傳送資料(tcp)

sendto( ) 傳送資料(udp)

receive( ) 接收資料(tcp)

recv( )  接收資料(udp)

accept( ) 接收連線

listen( ) 網路監聽

如上**所示,ip v4專用函式在ip v6環境下已經不能使用,他們一般有乙個對應的ip v4/v6通用函式,但是在使用通用函式的時候需要乙個協議型別引數(af_inet/af_inet6)。另外還增加了兩個功能強大的函式getaddrinfo( )和getnameinfo( ),幾乎可以完成所有的位址和名字轉化的功能。

windows平台ipv6程式一例

下面我將給出windows平台下的乙個例子。

系統平台:windows 2000 professional sp3+tpipv6-001205-sp3-ie6+vc6

說明:在本程式中只採用乙個socket,用wsaasyncselect來完成收與發的處理,為了方便起見,採用udp方式。同時只專注ipv6的寫法,不考慮函ipv4/ipv6相容。如何編寫ip無關的程式,有機會再另行撰文。

注:由於windows2000只是提供了ipv6的技術預覽版,所以在有些地方支援上並不好。比如win2k在recvfrom的實現上好像有點問題,而linux中同樣的**卻沒問題。兩者在recv的實現上都很正常。所以如果要開發程式最好是在window xp或是linux上進行。

下面是程式中關鍵的幾步:

1.標頭檔案的引入

#include

#include

#include "tpipv6.h" // form ipv6 tech preview.(可以從tpipv6-001205-sp3-ie6安裝後所在目錄裡找到)

#pragma comment(lib,"ws2_32")//引入庫函式。

2.建socket updatedata(true);

memset(&hints,0,sizeof(hints));

//hints.ai_family=pf_unspec;//這樣可以由系統自己進行判斷,這裡我們直接指定是ipv6

hints.ai_family=af_inet6;//指定用ipv6協議

hints.ai_socktype=sock_dgram;

hints.ai_protocol=ipproto_udp;//用udp

hints.ai_flags=ai_numerichost;//ip用數字表示

rc=getaddrinfo((lpctstr )m_send,"2000",&hints,&res);//解析位址

if(rc!=0)

s_send=socket(res->ai_family,res->ai_socktype,res->ai_protocol);//建socket

if(s_send==invalid_socket)

else

}if ( wsaasyncselect( s_send, m_hwnd, um_packet, fd_read ) == socket_error )//非同步選擇

3.傳送 memset(&hints,0,sizeof(hints));

hints.ai_family=af_inet6;

hints.ai_socktype=sock_dgram;

hints.ai_protocol=ipproto_udp;//這裡也可以改為0,讓系統自己選

hints.ai_flags=ai_numerichost;

rc=getaddrinfo((lpctstr )m_receive,"2000",&hints,&res);//解析對方收位址

if(rc!=0)

rc=sendto(s_send,m_sendtxt,m_sendtxt.getlength(),0,

res->ai_addr,res->ai_addrlen);

if (rc== socket_error)

else

4.非同步觸發事件 lresult cmy6ddlg::onpacket( wparam wparam, lparam lparam )

else

}

例項解析IPv6下的VC網路程式設計

例項解析ipv6下的vc網路程式設計 自ipv4誕生至今已有20多年了,目前它雖仍因網際網路的成功而風光無限,但是如同 internet正在成為其自身巨大成功的受害者 一樣,目前ipv4位址的極度匱乏注定它將被歷史所淘汰。而ipv6 ipv4的繼承人,具有位址空間巨大,支援qos等許多優良特性,在不...

WindowsXP下的IPv6配置

1.ipv6 install uninstall windowsxp的ipv6協議棧是需要手動安裝的,安裝的方法就是執行 ipv6install 當然什麼時候如果你不想玩ipv6了,你可以執行 ipv6uninstall 把ipv6協議棧卸掉。注意有的時候卸除ipv6協議棧是有必要的,因為windo...

ipv4 only網路環境下訪問ipv6站點

使用6plat.org openvpn 無需資金投入 進入ipv6網路 這裡我們主要使用的是6plat.org提供的 46模組 ipv4到ipv6 功能,需要配合openvpn這個軟體,支援windows,mac os,android,ios。原理是使用openvpn在你的電腦上建立乙個虛擬網絡卡,...