我想打开虚拟接口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;
显示
如何在案例2中传递ioctl
?