Linux下虚拟网卡tun/tap

#include <stdio.h>
#include <string.h>
#include <linux/if_tun.h>
#include <sys/types.h>
#include <net/if.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int tun_create(char *dev, int flags)
{
struct ifreq ifr;
int fd;
int cmd;

if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
{
return fd;
}

memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, dev);
ifr.ifr_flags |= flags;

ioctl(fd, TUNSETIFF, (void *)&ifr);
return(fd);
}

int main(int argc, char *argv[])
{
int tun, ret;
unsigned char buf[4096];
unsigned char ip[4];
unsigned char ihl;

tun = tun_create("tun0", IFF_TUN | IFF_NO_PI);
if (tun < 0)
{
perror("tun_create");
return 1;
}
printf("TUN name is %s\n", "tun0");

while (1)
{

ret = read(tun, buf, sizeof(buf));
if (ret < 0)
{
break;
}
ihl = buf[0] & 0xf;
printf("The length of ip header is %d\n", ihl);
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;
}

这段代码基本是网络上复制的。不过网络上的代码没有把头文件帖全,害得我折腾了一番。没啥特别可说的,但有一点不明白的是,见红色部分。IP头的大小正好是20个字节,代码居然在21和23字节做操作,原则上这是option字段。把红色代码注释掉以后,程序可以正常运行,但是时延增加了0.3ms左右。没明白!

时间: 2024-08-29 16:41:58

Linux下虚拟网卡tun/tap的相关文章

虚拟网卡TUN/TAP 驱动程序设计原理

昨天韦哥写了<Linux下Tun/Tap设备通信原理>一文,只提到了两个使用Tun的用户进程之间的通信路径,并没有说明Tun虚拟网卡驱动是如何实现的,而正好看到了这里的一篇讲解这方面的文章,果断转载了,感谢作者,原文在这里:虚拟网卡TUN/TAP 驱动程序设计原理 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun

Linux的虚拟网卡TUN和TAP

TUN/TAP 提供了给用户空间程序的包的接收和传输,它可以看成是简单的点对点设备或是以太网设备.它不是从物理设备接收包,而是从用户空间程序接收包.它发送包不是通过物理设备来发送包,而是将这些包写入用户空间程序来发送.为了应用这个驱动,应用程序需要打开/dev/net/tun 设备(字符设备),然后发出一个控制(ioctl)来注册一个网卡设备,一个网络设备将命名为tunXX 或tapXX.依赖于你所设定的标志位.当应用程序关闭文件描述符的时候,网络设备和其他相关的路由将会消失.依赖于所选择的设备

linux下虚拟网卡tap or tun

A TAP device is a virtual ethernet adapter, while a TUN device is a virtual point-to-point IP link. tap 模式是虚拟以太网链路,tun模式是虚拟点对点链路. tap 工作在二层,tun工作在三层. tap 可以传输广播,tun不能传输广播.

linux下一个网卡配置多个ip【虚拟ip】

Linux下配置网卡ip别名何谓ip别名? 用windows的话说,就是为一个网卡配置多个ip. 什么场合增加ip别名能派上用场? 布网需要.多ip访问测试.特定软件对多ip的需要...and so on. 下面通过几个例子简单介绍一下如何使用ifconfig命令给网卡配置ip别名. 一.首先为服务器网卡配置静态ip地址 #ifconfig eth0 192.168.6.99 netmask 255.255.255.0 up eth0                     //机器的第一个网卡

Linux下双网卡绑定(bonding技术)

http://www.cnblogs.com/qmfsun/p/3810905.html Linux网卡绑定探析 2013-08-20 15:39:31 现在很多服务器都自带双千兆网口,利用网卡绑定既能增加网络带宽,同时又能做相应的冗余,目前应用于很多的场景.linux操作系统下自带的网卡绑定模式,Linux bonding驱动提供了一个把多个网络接口设备捆绑为单个网络接口设置来使用,用于网络负载均衡及网络冗余.当然现在网卡产商也会出一些针对windows操作系统网卡管理软件来做网卡绑定(win

Linux下多网卡时,如何快速辨别网卡ID与物理网卡的对应关系(即ethtool命令)

一般购买的服务器都有4个网卡,这个时候在安装好服务器后,配置IP的时候就郁闷了 如是一个浪潮8560M2服务器安装Redhat后的网卡显示: [[email protected] ~]# ifconfig -a eth0      Link encap:Ethernet  HWaddr 00:E0:ED:2D:0F:58 inet addr:192.168.4.10  Bcast:192.168.4.255  Mask:255.255.255.0 UP BROADCAST RUNNING MUL

Linux下多网卡MAC配置问题

HWADDR=, 其中 以AA:BB:CC:DD:EE:FF形式的以太网设备的硬件地址.在有多个网卡设备的机器上,这个字段是非常有用的,它保证设备接口被分配了正确的设备名,而不考虑每个网卡模块被配置的加载顺序.这个字段不能和MACADDR一起使用.MACADDR=, 其中 以AA:BB:CC:DD:EE:FF形式的以太网设备的硬件地址.在有多个网卡设备的机器上.这个字段用于给一个接口分配一个MAC地址,覆盖物理分配的MAC地址. 这个字段不能和HWADDR一起使用. 前者是用来根据HWADDR绑

(笔记)Linux下检测网卡与网线连接状态

http://blog.chinaunix.net/space.php?uid=20357359&do=blog&cuid=1798479 Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h>

linux下一个网卡绑定多个ip

[[email protected] ~]# cd /etc/sysconfig/network-scripts/ [[email protected] network-scripts]# cp ifcfg-eth0 ifcfg-eth0:1 [[email protected] network-scripts]# vim ifcfg-eth0:1 DEVICE=eth0:1HWADDR=00:0C:29:73:E6:0DTYPE=EthernetUUID=98b5dc88-94c0-4a78-