程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# Radius 協議中的ipv6 處理算法思路

c# Radius 協議中的ipv6 處理算法思路

編輯:C#入門知識

如果我們想要模擬一個協議或者多個協議進行相關的操作,那麼首先我們要了解這個協議中的數據發送傳輸,如何定義包的類型和格式。通常情況下,很少有人用C#來做這些東西。因為如此底層的東西,C#做不了,我也不打算用C#做底層協議UDP或者Radius中的通信,但是如果你用來測試某個協議,從底層到上層兩個終端之間的通信的話,我想C#還是可以做的。

引入:如果做協議包的收發測試,對於一般包的定義格式,通常情況下,會用byte[]數組對一個ip地址進行存儲和發送。有的時候,例如一個ipv4地址,的話,簡單的函數調用Split(.") 192.168.1.1就可以按著.進行了分割。那麼對於radius協議中,如果使用ipv6進行通信地址格式的話,我們應該如何處理地址到一些字符數組中呢。下面看一下 RFC中的地址格式定義:

 

A summary of the NAS-IPv6-Address Attribute format is shown below.
   The fields are transmitted from left to right.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |             Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                Address
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               Address             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我們姑且不管如何到byte[]數組,畢竟他的存儲范圍是有限的,暫且在這篇文章中使用string數組進行存儲。分割好的IPv6地址。說到IPV6的地址格式,對於不是很清楚的童鞋們,我簡單的進行闡述。

算法輸出結果預估,先寫出來大家對算法目的看的更清楚

Input : n:n:n:n:n:n:n:n。

OutPut:new string[8] {"n",....."n"} 直接輸出

Input:3FFE:FFFF::8:800:20C4:0              ::1

OutPut:{"3FFE","FFFF","0","0",...."20C4","0"} 補零輸出  {"0","0",......"1"}

Input:n:n:n:n:n:n:d.d.d.d

OutPut: {"n","n"....."d.d->16位16進制","d.d->16位16進制"}

Input: n:n::d.d.d.d

Output: {"n","n","0","0",...."d.d->16位16進制"}

算法部分:對於此種的ipv6地址,就算是當他最標准的吧,從頭到尾都是:分割,那麼,直接使用split函數以:分割即可,得到一個長度為8的數組。

對於有(::)在地址裡面的,我們首先使用::將IP地址分成前後兩個部分,之後計算前後兩部分的長度,填充中間的省略的0的個數,返回冒號十六進制的形式IPV6標准數組。

對於混合式的IPv6地址比較復雜,因為如果單純的是前96位:表示的IPv6地址加上後面的32位IPv4地址,也好處理,將後面的部分以.分割之後,變換成連個16位的ipv6即可。但是考慮到前面會有省略的一部分0的,也就是存在::形式的IPv6地址,那麼就要參考壓縮式的處理方式先對::進行分割後,在對存在.的ipv4混合地址進行處理。

附上代碼,沒來得及優化,測試幾個還行。比較亂,有幾個羅嗦的地方還需要改進。
 public static string[] IPAddressToArray(string address)
        {
            string[] result = new string[8];
            //address = string.Empty;
            string[] ip = null;
            string[] iptemp = null;
            string[] iptempv4 = null;
            string[] ipresult = new string[8];
            //address = "5::2:10:20";
            string[] a = { "::" };
            

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved