[C++]用網卡來做Loopback - 使用winpcap

將ethernet封包直接回彈到原本發送的裝置的機制,通稱作Loopback。我們公司有出一種Loopback的機器,只要接上去,在面板選擇模式,不太需要設定就可以直接將送至那台機器的乙太封包給彈回。

有Loopback的機制,可以讓一個端口同時發送接收並呈現資料,有一些測試需要這樣的需求,不過很多時候可能我手邊沒有那種機器,所以我就想說來用網卡來做。

當然,網卡效能不能和硬體的機器來比較,畢竟網卡最終還是透過O.S.,以及軟體去呈現。這一篇運用的是Winpcap的收發包功能來實現。Winpcap的使用,之前就已經利用API寫過一個案例,所以只是依樣畫葫蘆,更簡單的程式而已。

一樣這支程式會用到:Grid / Winpcap / Thread。如此而已。

最主要的技術在於"回彈"。我這邊只寫了Layer 2的Loopback,包括要不要置換MAC的選擇。回彈有單純原封包打回,跟把MAC交換後打回。經過實際測量,要不要交換MAC並不會影響速度。畢竟MAC交換的時間,遠遠比利用Winpcap收送包時間短的多了。

我是這樣交換的:

uip_eth_addr tmpMAC;
memcpy(tmpMAC.addr, ETHERBUF->dest.addr, 6);
memcpy(ETHERBUF->dest.addr, ETHERBUF->src.addr, 6);
memcpy(ETHERBUF->src.addr, tmpMAC.addr, 6);

說穿了就是Swap而已。經過實際測驗,我的電腦是i3,速率如下,跟至少10M/100M的機器比起來慢的多:

收送模式
收端速率(Mbps)
送端速率(Mbps)
單純收包
15
--
不交換MAC送收
8
>7.5
交換MAC送收
8
>7.5

程式畫面:

只要不是需要很大量的loopback,用這支程式去呼叫網卡即可以完成了。不過我電腦在開啟交換MAC送收之後,一段時間電腦忽然藍白畫面,不知是不是這樣操網卡,網卡硬體本身暫時壞掉導致,所以要很小心使用!!

--完整Source Code(VC++ 2008 vaildated)
Download


0 意見:

搜尋此網誌

總網頁瀏覽量

TK呱呱

Made with by TK