Android 如何解决ioctl操作不允许的问题?

Android 如何解决ioctl操作不允许的问题?,android,c,kernel,ioctl,tun,Android,C,Kernel,Ioctl,Tun,我想打开一个虚拟接口tun,但是当我使用函数ioctl(ioctl(fd,TUNSETIFF,&ifr))时,它总是返回ioctl operation not allowed 在案例1中,ioctl是pass(它使用fd套接字,ioctl SIOCGIFFLAGS): jint fd=socket(AF_INET,SOCK_DGRAM,0); __android日志打印(android日志信息,“MYPROG”,“fd=%d,%s”,fd,strerror(errno)); memset(&if

我想打开一个虚拟接口tun,但是当我使用函数ioctl(ioctl(fd,TUNSETIFF,&ifr))时,它总是返回ioctl operation not allowed

在案例1中,ioctl是pass(它使用fd套接字,ioctl SIOCGIFFLAGS):

jint fd=socket(AF_INET,SOCK_DGRAM,0);
__android日志打印(android日志信息,“MYPROG”,“fd=%d,%s”,fd,strerror(errno));
memset(&ifr,0,sizeof(ifr));
ifr.ifr_flags=IFF_TUN | IFF_NO_PI;
char tunnel[]=“tun”;
strncpy(ifr.ifr_名称、隧道、IFNAMSIZ);

如果(ioctl(fd,SIOCGIFFLAGS,(void*)和ifr)从您得出的结论是
ioctl()
EPERM
中失败(不允许操作)
-1
只是告诉您调用失败了,但不是因为什么原因。您确定
open()
成功了,这并没有返回
-1
?我使用android日志打印(ANDROID_LOG_INFO,“MYPROG”,“errnofd=%d,%s”,errno,strerror(errno));您显示的代码不正确。请始终显示真实代码。请向我们显示日志语句的确切位置。这可能很重要。
jint fd = socket(AF_INET, SOCK_DGRAM, 0);
__android_log_print(ANDROID_LOG_INFO, "MYPROG", "fd = %d, %s", fd, strerror(errno));


memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

char tunnel[] = "tun";
strncpy(ifr.ifr_name, tunnel, IFNAMSIZ);

if (ioctl(fd, SIOCGIFFLAGS, (void *)&ifr)<0) {
    __android_log_print(ANDROID_LOG_INFO, "MYPROG", "errno = %d, %s", errno, strerror(errno));
    close(fd);
    exit(1);
}

return fd;
jint fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
__android_log_print(ANDROID_LOG_INFO, "MYPROG", "fd = %d, %s", fd, strerror(errno));

memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

char tunnel[]="tun";
strncpy(ifr.ifr_name, tunnel, IFNAMSIZ);

if (ioctl(fd,TUNSETIFF, (void *)&ifr)<0) {
    __android_log_print(ANDROID_LOG_INFO, "MYPROG", "errno = %d, %s", errno, strerror(errno));
    close(fd);
    exit(1);
}

return fd;