例項解析ipv6下的vc網路程式設計
自ipv4誕生至今已有20多年了,目前它雖仍因網際網路的成功而風光無限,但是如同「internet正在成為其自身巨大成功的受害者」一樣,目前ipv4位址的極度匱乏注定它將被歷史所淘汰。而ipv6—ipv4的繼承人,具有位址空間巨大,支援qos等許多優良特性,在不久的將來會迅速的普及,但ipv6的出現將對目前網路程式設計方式產生一定的影響。
本文將就ipv6環境下的網路程式設計方式進行例項解析。
最終效果:
配置篇目前我們所用的ip協議是v4版本的, 比如192.168.0.1。它是在2023年由rfc791標準化的。而ipv6是ip協議的新版本,標準化工作始於2023年,主要部分在2023年完成。它的位址長度為128位。比如3ffe:b00:c18:1::10。
例項篇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網路程式設計2
例項解析ipv6下的vc網路程式設計2 例項篇ipv6程式相對於ipv4改動並不大。其中主要的改動就是位址結構與位址解析函式。在rfc中詳細說明了socket api 為適應ipv6所做的改動。而且windows平台與linux平台在實現上也幾乎是一樣的。只不過標頭檔案與支援程度等有所不同罷了 具體...
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在你的電腦上建立乙個虛擬網絡卡,...