有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 意見:
張貼留言