<acronym id="uci6i"><center id="uci6i"></center></acronym><rt id="uci6i"></rt>
<rt id="uci6i"><center id="uci6i"></center></rt>
<object id="uci6i"></object>
<acronym id="uci6i"><div id="uci6i"></div></acronym><acronym id="uci6i"></acronym>
<acronym id="uci6i"><div id="uci6i"></div></acronym>

企業新聞

讓你的Socket應用兼容IPv6

2020-12-17 13:35:59 zou

讓你的Socket應用兼容IPv6


IPv6是英文“Internet Protocol Version 6”(互聯網協議第6版)的縮寫,是互聯網工程任務組(IETF)設計的用于替代IPv4的下一代IP協議,其地址數量號稱可以為全世界的每一粒沙子編上一個地址。


隨著互聯網越來越普及,以及物聯網的興起,IPv4地址已遠遠不夠用,IPv6的普及將是不可避免的趨勢。以前,我們的大部分socket程序幾乎都是針對IPv4而開發,如果不做升級重構,那么使用IPv6地址的客戶端將無法使用服務端提供的服務。如何才能像ESFramework一樣,使服務端和客戶端都可以同時支持IPv6了?使我們的P2P打洞也兼容IPv6了?下面我們將要點 一 一 點出。


首先,要了解兩個最基礎的事實:


(1)通信的雙方,無論是服務端與客戶端之間,或是客戶端與客戶端之間的P2P通信,必須使用相同的協議版本--要么都是IPv4,要么都是IPv6。


(2)在沒有特別安裝附件的情況下,有的OS可能只支持IPv4,有的可能只支持IPv6,有的即支持IPv4也支持IPv6??梢酝ㄟ^Socket類的OSSupportsIPv6和OSSupportsIPv4屬性來作判斷。


一.TCP服務端

要讓TCP服務端即能夠接收IPv4地址的客戶端的請求,也能接收IPv6地址客戶端的請求,前提是服務器的OS即支持IPv4也支持IPv6。默認的,windows2003Server是只支持IPv4的,可以通過安裝協議來使其支持IPv6。


然后,寫服務端程序時,必需同時監聽本機IPv4地址和IPv6地址,并且是監聽這兩個地址的同一個端口。比如,像下面這樣:


 int port = 9900; TcpListener tcpListenerV4 = new TcpListener(IPAddress.Any, port); TcpListener tcpListenerV6 = ne


如此,客戶端無論是使用的IPv4還是IPv6,其向服務端發起連接請求時,都可以被服務端接受。


二.TCP客戶端

我們現在假設服務端程序已經兼容了IPv6,并且其提供服務的IPv4地址為192.168.0.104,IPv6地址為fe80::14d8:a209:89e6:c162%14。


那么TCP客戶端在與服務端建立連接之前,要看本地OS對IPv4和IPv6的支持情況:


(1)如果本地OS僅支持IPv4,或者同時支持IPv4和IPv6,那么簡單地,就讓其連接到服務器的IPv4地址。示例代碼如下所示:


 TcpClient client = new TcpClient(AddressFamily.InterNetwork); client.Connect("192.168.0.104", 9900);


(2)如果本地OS僅支持IPv6,那么,就讓其連接到服務器的IPv6地址。示例代碼如下所示:


TcpClient client = new TcpClient(AddressFamily.InterNetworkV6); client.Connect("fe80::14d8:a209:89e6:c162%14", 9900);


三.UDP

對于UDP而言,服務端和客戶端可以采用完全一樣的模型。要讓基于UDP的應用程序兼容IPv6,會稍微復雜一些。


(1)需要創建兩個UdpClient實例,一個用于IPv4,一個用于IPv6。示例代碼如下所示:


 int port = 9800; UdpClient udpClient4 = new UdpClient(port, AddressFamily.InterNetwork); UdpClient udpClient6 = new UdpClient(port ,AddressFamily.InterNetworkV6);


(2)需要在兩個UdpClient實例上調用接收數據的方法,來接收數據。

(3)發送數據時,需要根據目標地址是IPv4還是IPv6,來選擇正確的UdpClient實例進行發送。示例代碼如下所示:


 public void Send(byte[] data, IPEndPoint endPoint) { if (endPoint.AddressFamily == AddressFamily.InterNetwork) { this.udpClient4.Send(data, data.Length, endPoint); } else { this.udpClient6.Send(data, data.Length, endPoint); } }


上面的示例,我們是假設當前的OS同時支持IPv4和IPv6,如果僅僅支持其中的一個,那么就應該只創建udpClient4或udpClient6一個實例。


四.P2P與IPv6

如果我們的TCP客戶端以及UDP都按照了上面類似的方式進行了重構升級,那么,無論是基于TCP的P2P打洞,還是基于UDP的P2P打洞,其邏輯代碼都不需要做任何修改,就可以完全兼容IPv6了。


本文只是列出了將Socket應用程序重構升級使其支持IPv6的要點,在實際實現的過程中,還有很多的細節需要處理,才能在現實的復雜環境中正常運行。這里就不再贅述了。


首頁
產品
新聞
聯系
多人强伦姧人妻完整版,国产精品亚洲精品日韩已满十八小,特大黑人娇小亚洲女,超清无码AV最大网站 宁晋县| 纳雍县| 侯马市| 池州市| 金塔县| 白沙| 哈巴河县| 台中县| 始兴县| 平湖市| 福贡县| 河南省| 通城县| 刚察县| 洪泽县| 遂平县| 文登市| 若尔盖县| 巴彦淖尔市| 灵石县| 虹口区| 昌邑市| 灵山县| 利辛县| 白山市| 武安市| 峨眉山市| 赤壁市| 怀来县| 花莲县| 诸城市| 措美县| 通河县| 墨脱县| 绥芬河市| 理塘县| 巴林左旗| 清远市| 屏东县| 五原县| 额尔古纳市| http:// http:// http:// http:// http:// http://