C 使用sharppcap實現網路抓包 2

2021-09-08 18:36:39 字數 1522 閱讀 4507

雖然網上已經有了sharpsniffer

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));

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位址

string s = getbytearrayhexstring(buf, 0, recvedsize); //此函式把位元組陣列格式化,詳細參考源**

printline(s);

詳細過程參考源**

本程式在winxp sp3, vs2010, .net framework 4.0 client & .net framework 2.0下編譯執行通過

能成功抓包,如ping發出和收到的資料報能抓到,開啟網頁的資料報也能抓到。

c 使用sharppcap實現 網路抓包

原文 詳細用法 csharp view plain copy print?using system using system.collections.generic using system.linq using system.text using system.io using system.th...

跳台階 牛客網(C 實現)

一 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 二 程式設計思路 一開始想著先列出前幾級台階的跳法,看看是否能發現什麼規律。1級台階 跳1級 1種跳法 2級台階 跳1級 跳2級 2種跳法 3級台階 1級 1級 1級 1...

使用C 實現Vector

最近開始學習資料結構與演算法了,使用的是weiss的資料結構與演算法c 描述,第三版和第四版。其中第四版已經全部用c 11的標準重寫了。感覺我自己寫的時候有點糾結到底用c 老的標準還是c 11的標準,哈哈,選擇困難!今天我主要用c 老的標準寫了vector類,因此沒有實現移動建構函式和移動拷貝函式。...