2012-09-10 51 views
2

我有一本名爲NET網絡編程的書,它有以下代碼示例,用於嗅探網絡堆棧上的IP數據包。我抄代碼示例從書字對字,所以請原諒缺乏文體公約等.NET中的網絡數據包嗅探權限異常

List<string> packets = new List<string>(); 

public void Run() 
{ 
    int len_receive_buf = 4096; 
    int len_send_buf = 4096; 
    byte[] receive_buf = new byte[len_receive_buf]; 
    byte[] send_buf = new byte[len_send_buf]; 
    int cout_receive_bytes; 
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
    socket.Blocking = false; 
    IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName()); 
    socket.Bind(new IPEndPoint(IPAddress.Parse(IPHost.AddressList[0].ToString()), 0)); 
    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1); 
    byte[] IN = new byte[4] { 1, 0, 0, 0 }; 
    byte[] OUT = new byte[4]; 
    int SIO_RCVALL = unchecked((int)0x98000001); 
    int ret_code = socket.IOControl(SIO_RCVALL, IN, OUT); 
    while(true) 
    { 
     IAsyncResult ar = socket.BeginReceive(receive_buf, 0, len_receive_buf, SocketFlags.None, null, this); 
     cout_receive_bytes = socket.EndReceive(ar); 
     Receive(receive_buf, cout_receive_bytes); 
    } 
} 

public void Receive(byte[] buf, int len) 
{ 
    if(buf[9] == 6) 
    { 
     packets.Add(Encoding.ASCII.GetString(buf).Replace("\0", " ")); 
    } 
} 

我第一次測試,這是幾年前(甚至之前Vista的存在)和我使用的機器是32位Windows XP Proferssional平臺,其網卡上運行IPv4。

我現在試圖在運行IPv6的網卡上運行的64位Windows 7平臺上進行測試,但無法運行。我認爲這與IPv6有關。任何人都可以建議我如何有效地解決此問題?

編輯:這是個例外,我得到當我嘗試運行...

enter image description here

+3

它不起作用? –

+2

我真的質疑任何代碼的作者身份,其中包括像'IPAddress.Parse(IPHost.AddressList [0] .ToString())' - 嗯,爲什麼不只是'IPHost.AddressList [0]'? –

+0

@Damien_The_Unbeliever我非常同意! – series0ne

回答

6

頭是IPv4IPv6之間顯著不同。

做的檢查:

if(buf[9] == 6) 

,檢查數據包是否是TCP對IPv4正在查詢的IPv6報文的源地址字段的一部分。對於IPv6,它應該檢查偏移量爲6 *的「下一個頭」。當然,現在你還必須檢查IP版本,第一個知道是否檢查偏移6或偏移9


對於異常消息,很可能是因爲你沒有以管理員身份運行,這你需要聽上raw sockets(本地文檔,但仍然適用):

要使用類型的插座SOCK_RAW需要管理員權限。運行使用原始套接字的Winsock應用程序的用戶必須是本地計算機上的管理員組的成員,否則原始套接字調用將失敗,錯誤代碼爲WSAEACCES。在Windows Vista和更高版本上,創建套接字時會強制訪問原始套接字。在Windows的早期版本中,在其他套接字操作期間強制訪問原始套接字。


(*)當然,可能有多個IPv6包頭合作,通過你會發現,這是一個TCP數據包之前。

+0

嗨,感謝發佈。該代碼顯然需要更新A LOT ...請參閱我上次編輯的示例異常。 – series0ne

+0

感謝您的上次修改。當我使用提升的權限運行時(給定正確的IP地址)。 - 接受答案 – series0ne