最近在寫(xiě)一些很重要的東西,但是流年不利,總是遇到很多很多問(wèn)題,這不,上篇文章剛解決了如何安裝tun
模塊的問(wèn)題.還沒(méi)有得瑟多久呢,立馬踩到坑了,我用c
編碼時(shí),試圖打開(kāi)虛擬的tun
設(shè)備的時(shí)候老是出現(xiàn)這個(gè)玩意.
確定你的設(shè)備存在tun
模塊之后,你用下面的命令建立一個(gè)設(shè)備文件:
mknod /dev/net/tun c 10 200
參數(shù)c
表示是字符設(shè)備,10
和200
分別是主設(shè)備號(hào)和次設(shè)備號(hào).
接下來(lái),我們可以測(cè)試一下,打開(kāi)/dev/net/tun
設(shè)備,下面是非常簡(jiǎn)單的一個(gè)測(cè)試程序:
#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;
}
在執(zhí)行這個(gè)程序的時(shí)候,我經(jīng)常收到這樣的錯(cuò)誤信息:
ioctl TUNSETIFF: Operation not permitted
當(dāng)然,我將/dev/net/tun
文件添加了可讀可寫(xiě)屬性,不然的話,程序是執(zhí)行不到ioctl
的.
我在網(wǎng)上找了很久,并沒(méi)有找到很好的解決方案,但是最近看了一下別人的執(zhí)行過(guò)程,我發(fā)現(xiàn)我做錯(cuò)了一件很離譜的事情,那就是我并沒(méi)有在sudo
下運(yùn)行這個(gè)程序,然后我嘗試了一下,然后成功了.
如果你想用gdb
來(lái)調(diào)試這個(gè)代碼,也必須先加sudo
,類似這樣:
sudo gdb programmar_name
如果你用VisualGDB
在調(diào)試程序,可以參照下面的圖片:
VisualGDB這樣設(shè)置
好吧,希望對(duì)你有幫助.