2

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

在情况 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

我如何通过ioctl案例 2?

4

0 回答 0