linux下实现虚拟网卡
我们在使用VMWARE的虚拟化软件时经常会发现它们能都能虚拟出一个网卡,貌似很神奇的技术,其实在Linux下很简单,有两种虚拟设

备,TUN时点对点的设备,tap表示以太网设备的,做为虚拟网卡驱动,Tun/tap驱动程序的数据接收和发送并不直接和真实网卡打交道,而是通

过用户态来转交。在linux下,要实现核心态和用户态数据的交互,有多种方式:可以通用socket创建特殊套接字,利用套接字实现数据交

互;通过proc文件系统创建文件来进行数据交互;还可以使用设备文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就

是核心态和用户态的一个接口,Tun/tap驱动就是利用设备文件实现用户态和核心态的数据交互。

#include <unistd.h>
#include <stdio.h>
#include <curses.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>
#include <linux/if_tun.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <linux/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>  
int tun_creat(char *dev,int flags)
{
 struct ifreq ifr;
 int fd,err;
 assert(dev != NULL);
 if((fd = open ("/dev/net/tun",O_RDWR))<0) //you can replace it to tap to create tap device.
  return fd;
 memset(&ifr,0,sizeof (ifr));
 ifr.ifr_flags|=flags;
 if(*dev != '/0')
  strncpy(ifr.ifr_name,dev,IFNAMSIZ);
 if((err = ioctl(fd,TUNSETIFF,(void *)&ifr))<0)
 {
  close (fd);
  return err;
 }
 strcpy(dev,ifr.ifr_name);
 return fd;
}

int main()
{
 int tun,ret;
 char tun_name[IFNAMSIZ];
 unsigned char buf[4096];
 tun_name[0]='/0';
 tun = tun_creat(tun_name,IFF_TAP|IFF_NO_PI);
 if(tun<0)
 {
  perror("tun_create");
  return 1;
 }
 printf("TUN name is %s/n",tun_name);
        while (1) {
                unsigned char ip[4];

ret = read(tun, buf, sizeof(buf));
                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;
                printf("read %d bytes/n", ret);
                 ret = write(tun, buf, ret);
                printf("write %d bytes/n", ret);
        }
 return 0;
}

另开启一个终端

路由配置:

ifconfig devname 10.0.0.1 up;    //10.0.0.1是本虚拟网卡的IP地址,uP是激活该网卡

route add -net 10.0.0.2 netmask 255.255.255.255 dev devname

ping 10.0.0.2

开始测试

最新文章

  1. Python VS PHP 基础语法
  2. 【项目】百度搜索广告CTR预估
  3. linux TLS 线程本地变量
  4. Bzoj1001 [BeiJing2006]狼抓兔子
  5. hiberante学习笔记
  6. phalcon(费尔康)框架学习笔记
  7. 线段树(单点更新)HDU1166、HDU1742
  8. Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全
  9. UICollectionView 集合视图用法,自定义Cell
  10. 转log4cxx: Could not read configuration file [log4cxx.properties]解决办法
  11. pip 安装mysqlclient报错OSError: mysql_config not found
  12. React 中的key值
  13. Java开发笔记(五十五)关键字static的用法
  14. pandas合并数据集-【老鱼学pandas】
  15. 【Beta阶段】第十次Scrum Meeting!!!
  16. 实现与JS相同的Des加解密算法【转】
  17. git 先创建本地仓库,再关联远程
  18. Day25-JSONP跨域请求
  19. 解决UITableView分割线距左边有距离的办法
  20. Goroutines和Channels(五)

热门文章

  1. js判断是否是pc
  2. android 单独编译某个模块
  3. webpack的学习
  4. android部分手机onclick事件触发2次
  5. js中关于arguments
  6. poj 3270(置换群)
  7. $(&quot;#province&quot;).val();取不到select的值求解
  8. LR 解决中文乱码(来源——百度)
  9. Linux CPU相关信息查看
  10. .net/c#连接sqlserver