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

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

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

mknod /dev/net/tun c 10 200

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

接下来,我们可以测试一下,打开/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

如果你用VisualGDB在调试程序,可以参照下面的图片:
使用ioctl函数打开tun设备时遇到的问题--operation not permmitted!_第1张图片

好吧,希望对你有帮助.

你可能感兴趣的:(Linux)