/**
* linux tun 例子 **來至
* 和
* * 建立乙個tun0的虛擬網絡卡進行通訊,程式關閉後將消失。
* ping 10.0.0.1
* documentation/networking/tuntap.txt
* br_select.c bridge based on select system call.
* br_sigio.c bridge based on async io and sigio signal.
* *
* */[cpp]view plain
copy
print?
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*** 啟用介面
*/int inte***ce_up(char *inte***ce_name)
struct ifreq ifr;
strcpy(ifr.ifr_name,inte***ce_name);
short flag;
flag = iff_up;
if(ioctl(s, siocgifflags, &ifr) < 0)
ifr.ifr_ifru.ifru_flags |= flag;
if(ioctl(s, siocsifflags, &ifr) < 0)
return 0;
} /**
* 設定介面ip位址
*/int set_ipaddr(char *inte***ce_name, char *ip)
struct ifreq ifr;
strcpy(ifr.ifr_name, inte***ce_name);
struct sockaddr_in addr;
bzero(&addr, sizeof(struct sockaddr_in));
addr.sin_family = pf_inet;
inet_aton(ip, &addr.sin_addr);
memcpy(&ifr.ifr_ifru.ifru_addr, &addr, sizeof(struct sockaddr_in));
if(ioctl(s, siocsifaddr, &ifr) < 0)
return 0;
} /**
* 建立介面
*/int tun_create(char *dev, int flags)
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags |= flags;
if (*dev != '/0')
if ((err = ioctl(fd, tunsetiff, (void *)&ifr)) < 0)
strcpy(dev, ifr.ifr_name);
return fd;
} /**
* 增加到10.0.0.1的路由
* 同命令:route add 10.0.0.1 dev tun0
*/int route_add(char * inte***ce_name)
} int main(int argc, char *argv)
printf("tun name is %s/n", tun_name);
//啟用虛擬網絡卡增加到虛擬網絡卡的路由
inte***ce_up(tun_name);
route_add(tun_name);
while (1)
printf("/n");
if (ret < 0)
break;
memcpy(ip, &buf[12], 4);
memcpy(&buf[12], &buf[16], 4);
memcpy(&buf[16], ip, 4);
buf[20] = 0;
*((unsigned short*)&buf[22]) += 8;
ret = write(tun, buf, ret);
printf("write %d bytes/n", ret);
} return 0;
}
測試方法:
1 先編譯執行此程式,監聽資料的讀寫。
2 開啟另外乙個終端,執行ping命令,就是本地發乙個測試包到10.0.0.1
即可看到收到和接收的資料報ip包了。
linux下實現虛擬網絡卡TAP TUN例子
我們在使用vmware的虛擬化軟體時經常會發現它們能都能虛擬出乙個網絡卡,貌似很神奇的技術,其實在linux下很簡單,有兩種虛擬設 備,tun時點對點的裝置,tap表示乙太網裝置的,做為虛擬網絡卡驅動,tun tap驅動程式的資料接收和傳送並不直接和真實網絡卡打交道,而是通 過使用者態來轉交。在li...
Linux虛擬網路之tun(一)基本使用
tun tap 裝置是一種讓使用者態程式向核心協議棧注入資料的裝置,乙個工作在三層,乙個工作在二層。理論知識可以看 include include include include include include include include include include include incl...
Linux驅動之虛擬網絡卡
底層 工作在核心層的朋友應該有這種感覺,才開始學的時候真的很難,也就是說上手難,我就拿linux驅動來說吧,寫乙個完整的驅動,你得裝乙個虛擬機器跑linux吧,用來編譯驅動程式,虛擬機器裡面需要安裝一些庫和工具,驅動程式必須跑在乙個完整的系統上,所以首先你得搭建好整個系統,你還得了解硬體時序等,這些...