如何解决ioctl操作不允许?

时间:2015-10-12 15:53:30

标签: android c kernel ioctl tun

我想打开虚拟接口tun,但是当我使用函数ioctl(ioctl(fd,TUNSETIFF,& ifr))时,它总是返回 ioctl操作不允许

在案例1中,ioctl是通过的(它使用fd-socket,ioctl-SIOCGIFFLAGS):

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;
它表明了 http://imgur.com/OWslnDa

但在case2中,ioctl返回-1(操作不允许)(它使用fd-open,ioctl-TUNSETIFF)。

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;

显示

http://imgur.com/r9tNNiv

如何在案例2中传递ioctl

0 个答案:

没有答案