我想打开一个虚拟接口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;
但在 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;
表明
我如何通过ioctl
案例 2?