LINUX 虛擬網絡卡tun例子

2021-06-15 08:05:09 字數 2430 閱讀 8610

/**

*  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吧,用來編譯驅動程式,虛擬機器裡面需要安裝一些庫和工具,驅動程式必須跑在乙個完整的系統上,所以首先你得搭建好整個系統,你還得了解硬體時序等,這些...