使用ioctl函数打开tun设备时遇到的问题--operation not permmitted!

来源:互联网 发布:要做淘宝店的供货商 编辑:程序博客网 时间:2024/05/23 05:10

最近在写一些很重要的东西,但是流年不利,总是遇到很多很多问题,这不,上篇文章刚解决了如何安装tun模块的问题.还没有得瑟多久呢,立马踩到坑了,我用c编码时,试图打开虚拟的tun设备的时候老是出现这个玩意.

确定你的设备存在tun模块之后,你用下面的命令建立一个设备文件:

mknod /dev/net/tun c 10 200

参数c表示是字符设备,10200分别是主设备号和次设备号.

接下来,我们可以测试一下,打开/dev/net/tun设备,下面是非常简单的一个测试程序:

#include <unistd.h>#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <unistd.h>  #include <netinet/ip.h>  #include <linux/if_ether.h>  #include <linux/if_tun.h>#include <linux/if.h>#include <fcntl.h>#include <sys/ioctl.h>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

如果你用VisualGDB在调试程序,可以参照下面的图片:
VisualGDB这样设置

好吧,希望对你有帮助.

0 0