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