最近在写一些很重要的东西,但是流年不利,总是遇到很多很多问题,这不,上篇文章刚解决了如何安装tun
模块的问题.还没有得瑟多久呢,立马踩到坑了,我用c
编码时,试图打开虚拟的tun
设备的时候老是出现这个玩意.
确定你的设备存在tun
模块之后,你用下面的命令建立一个设备文件:
mknod /dev/net/tun c 10 200
参数c
表示是字符设备,10
和200
分别是主设备号和次设备号.
接下来,我们可以测试一下,打开/dev/net/tun
设备,下面是非常简单的一个测试程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int tun_alloc(char dev[IFNAMSIZ])
{
struct ifreq ifr;
int fd, err;
if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
{
perror("open");
return -1;
}
bzero(&ifr, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
if (*dev)
{
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
}
if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0)
{
perror("ioctl TUNSETIFF");
close(fd);
return err;
}
strcpy(dev, ifr.ifr_name);
return fd;
}
int main(int argc, char *argv[])
{
char tun_name[IFNAMSIZ];
tun_name[0] = '\0';
tun_alloc(tun_name);
getchar();
return 0;
}
在执行这个程序的时候,我经常收到这样的错误信息:
ioctl TUNSETIFF: Operation not permitted
当然,我将/dev/net/tun
文件添加了可读可写属性,不然的话,程序是执行不到ioctl
的.
我在网上找了很久,并没有找到很好的解决方案,但是最近看了一下别人的执行过程,我发现我做错了一件很离谱的事情,那就是我并没有在sudo
下运行这个程序,然后我尝试了一下,然后成功了.
如果你想用gdb
来调试这个代码,也必须先加sudo
,类似这样:
sudo gdb programmar_name
好吧,希望对你有帮助.