Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`ioctl`尝试对TUN设备进行TUNSETIFF时返回-1_C_Linux_Ioctl_Tun - Fatal编程技术网

`ioctl`尝试对TUN设备进行TUNSETIFF时返回-1

`ioctl`尝试对TUN设备进行TUNSETIFF时返回-1,c,linux,ioctl,tun,C,Linux,Ioctl,Tun,我一直在遵循有关创建TUN设备的文档。文档很少,但即使是文档也似乎不起作用。以下是我目前掌握的情况: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int tun_alloc(字符*开发) { 结构ifreq-ifr; int-fd,err; 如果((fd=open(“/dev/net/tun”,O_RDWR))

我一直在遵循有关创建TUN设备的文档。文档很少,但即使是文档也似乎不起作用。以下是我目前掌握的情况:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int tun_alloc(字符*开发)
{
结构ifreq-ifr;
int-fd,err;
如果((fd=open(“/dev/net/tun”,O_RDWR))<0)
return 7;//tun_alloc_old(dev);//这不会发生,linux文档不会说tun_alloc_old是什么
memset(&ifr,0,sizeof(ifr));
/*标志:IFF_TUN-TUN设备(无以太网报头)
*IFF_抽头-抽头装置
*
*IFF_NO_PI-不提供数据包信息
*/
ifr.ifr_flags=IFF_TUN;
如果(*dev){
printf(“将ifr.ifr\u名称设置为\%s\”\n,dev);
strncpy(ifr.ifr_名称、开发、IFNAMSIZ);
}
printf(“ifr.ifr\u名称为\%s\”\n,ifr.ifr\u名称);
如果((err=ioctl(fd,TUNSETIFF,(void*)和ifr))<0){
佩罗(“ERR”);
关闭(fd);
printf(“获取错误:%d\n”,错误);
返回错误;
}
printf(“过去TUNSETIFF错误检查\n”);
strcpy(dev,ifr.ifr\u name);
返回fd;
}
int main(){
字符名[128];
strcpy(&名称,“tun23”);
int tun=tun_alloc(名称);
printf(“tun\u alloc:%s id:%d\n”,名称,tun);
如果(tun==-1)返回-1;
而(1){
printf(“循环中\n”);
char-buf[128];
ssize_t readAmount=读取(tun,buf,128);
printf(“完成读取\n”);
如果(readAmount==-1){
printf(“读取0字节\n”);
继续;
}
printf(“读取%d:,读取金额);
对于(int i=0;i<128;i++){
printf(“%hhx”,buf[i]);
}
printf(“\n”);
}
返回屯;
}
编译器步骤是gcc-g3test.c&&a.out

当以非根用户身份运行时,我会得到以下输出

setting ifr.ifr_name to "tun23"
ifr.ifr_name is "tun23"
ERR: Operation not permitted
GOT ERROR: -1
tun_alloc: tun23  id: -1
作为root用户,它成功地进入了循环,但是对
read
的调用似乎被阻塞了

setting ifr.ifr_name to "tun23"
ifr.ifr_name is "tun23"
past TUNSETIFF error checking
tun_alloc: tun23  id: 3
in loop
(如果出现XY问题,我这样做的原因是尝试制作一个非常简单的类似vpn的应用程序)

问题是当它在这个循环中阻塞时,没有创建TUN设备。我正在查看
/dev/
。我不确定我将如何给它任何字节来读取

编辑:添加了一个正确的
perror
调用和相应的输出
操作不允许
、valgrind输出和一对打印语句。将尝试并调试strcpy错误


编辑:修复了strcpy错误,非常简单。由于缺乏创建TUN设备的权限,似乎在非root中失败。

若要帮助调试,请在
ioctl
无法获取更具体的错误原因时调用
peror
。非常好的建议,谢谢!使用它,可以更清楚地看出错误是权限问题——尽管我可以在root中工作,以找出如何创建它,然后再找出权限。我已经用所有更新的东西更新了这个问题。我还发现其中有非常相似的代码,但我没有看到任何会产生影响的差异