程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> IP數據包的校驗和算法C#版

IP數據包的校驗和算法C#版

編輯:關於C語言

為做偽IP,特地做了一個IP包,用C#改寫IP頭的校驗和算法。

資料一:

IP頭格式:

   版本號 (4位)

   IP頭長度 (4位)

   服務類型 (8位)

   數據包長度 (16位)

   標識段 (16位)

   標志段 (16位)

   生存時間 (8位)

   傳輸協議 (8位)

   頭校驗和 (16位)

   發送地址 (16位)

   目標地址 (16位)

   選項

   填充

資料二:

IP 協議采用統一的校驗算法,其計算比較簡單:設校驗和初值為0,然後對數據每16位求異或,結果取反,便得校驗和。校驗時將數據(含校驗和)按同樣的算法求和,結果為0則數據正確,不為0表示通訊出錯,需要丟棄該數據包。

算法源代碼:

public static UInt16 checksum(UInt16[] buffer,int size)

{

Int32 cksum=0;

int counter;

counter=0;

while(size>0)

{

UInt16 val=buffer[counter];

cksum =Convert.ToInt32(buffer[counter]);

counter =1;

size=-1;

}

cksum=(cksum>>16) (cksum&0xffff);

cksum =(cksum>>16);

return (UInt16)(~cksum);

}

注意:buffer數組為整個ip包數組,需要轉換成UInt16[];size為buffer數組的長度。

關於byte[]轉換成UInt16[]的方法比較簡單,在此不介紹了。

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