C#使用sharppcap实现网络抓包-----2
雖然網(wǎng)上已經(jīng)有了SharpSniffer
這一個SharpSniffer還是原創(chuàng)的
無他,唯為學(xué)習(xí)
工程文件下載:SharpSniffer.rar
1、創(chuàng)建套接字
2、綁定到本機
3、設(shè)置IOControl
4、接收數(shù)據(jù)
5、處理(顯示)數(shù)據(jù)
1、創(chuàng)建套接字
創(chuàng)建socket?,據(jù)MSDN,IOControlCode.ReceiveAll(后面要使用到)使用時有以下限制:
ReceiveAll | 啟用對網(wǎng)絡(luò)上的所有 IPv4 數(shù)據(jù)包的接收。套接字必須有?InterNetwork地址族,套接字類型必須是Raw, 并且協(xié)議類型必須為?IP。當(dāng)前用戶必須屬于本地計算機上的 Administrators 組,并且套接字必須綁定到特定端口。 Windows 2000 及更高版本的操作系統(tǒng)支持此控制代碼。此值等于 Winsock 2 SIO_RCVALL 常數(shù)。 |
?Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); //直接new一個
2、綁定到本機
綁架到本機,只有綁定到本機才可以監(jiān)聽數(shù)據(jù)包:
socket.Bind(new IPEndPoint(GetHostAdress(), 0));
3、設(shè)置IOControl
獲取本機IP地址,從一個主機名可能解析到好幾個地址,這要看你電腦的網(wǎng)絡(luò)適配器的狀態(tài)了,這里只取第一個:
private static IPAddress GetHostAdress()
{
? ? ?string hostName=Dns.GetHostName();
? ? ?var hostAddreses=Dns.GetHostAddresses(hostName);
? ? ?return hostAddreses[0];
}
很關(guān)鍵的一步,對IOControl進行設(shè)置。這里輸入?yún)?shù)為1表示RCVALL_ON(啟用接收所有包),當(dāng)輸入?yún)?shù)為0時表示RCVALL_OFF,具體定義在MSDN中WSAIoctl函數(shù)的Remark中說的很清楚:
byte[] outValue = BitConverter.GetBytes(0);
byte[] inValue = BitConverter.GetBytes(1);
socket.IOControl(IOControlCode.ReceiveAll,inValue, outValue); //對IO設(shè)置為可以接受所有包
很關(guān)鍵的,接收數(shù)據(jù):
int recvedSize = socket.ReceiveFrom(buf, ref ep); //用ReceiveFrom接受數(shù)據(jù)
// socket.Receive(buf);
//用Receive也能接受到數(shù)據(jù),不過使用ReceiveFrom可以直接獲取發(fā)送方IP地址
接下來要顯示數(shù)據(jù)了,這里只是簡單的把數(shù)據(jù)打印出來,如果想獲取該數(shù)據(jù)包的更多信息則就需要按IP數(shù)據(jù)包的格式來解析包的內(nèi)容了:
string s = GetByteArrayHexString(buf, 0, recvedSize); //此函數(shù)把字節(jié)數(shù)組格式化,詳細(xì)參考源代碼
PrintLine(s);
詳細(xì)過程參考源代碼
本程序在WinXP sp3, VS2010, .Net Framework 4.0 Client & .Net Framework 2.0下編譯運行通過
能成功抓包,如ping發(fā)出和收到的數(shù)據(jù)包能抓到,打開網(wǎng)頁的數(shù)據(jù)包也能抓到。
轉(zhuǎn)載于:https://www.cnblogs.com/1175429393wljblog/p/5622809.html
總結(jié)
以上是生活随笔為你收集整理的C#使用sharppcap实现网络抓包-----2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 关于笔记本键盘错乱的原因及解决办法
- 下一篇: python各进制、字节串间的转换