如何在FreeBSD中使用SIOCIFDESTROY?

时间:2014-09-01 07:22:04

标签: freebsd ioctl ifconfig tun-tap

我的应用创建了一个点按界面,一切正常。但是在FreeBSD上,当它退出时,tap接口仍然存在。要删除它,我必须手动运行此命令:

sudo ifconfig tap0 destroy

但我想在我的应用程序中以编程方式执行此操作。我在哪里可以找到SIOCIFDESTROY的文档?以下是我的应用退出时尝试过的内容:

struct ifreq ifr;
memset(&ifr, '\0', sizeof(ifr));
strcpy(ifr.ifr_name, "tap0");
int sock = socket(PF_INET, SOCK_STREAM, 0);
err = ioctl(sock, SIOCIFDESTROY, &ifr);

此时,err为零,但应用程序结束时仍然存在tap界面。任何人都知道我可能还缺少什么?

1 个答案:

答案 0 :(得分:2)

棘手的部分是试图找到要描述的文档是传递给ioctl()的参数。我从来没有找到任何体面的阅读。

只需设置了点按接口名称就可以完全删除ifreq。除了我在问题中包含的原始代码之外,还要注意我在删除实际的tap接口之前关闭了tap设备文件描述符。我只能想象这也可能是相关的:

    close(device_fd);
    struct ifreq ifr;
    memset(&ifr, '\0', sizeof(ifr));
    strcpy(ifr.ifr_name, "tap0");
    int sock = socket(PF_INET, SOCK_STREAM, 0);
    err = ioctl(sock, SIOCIFDESTROY, &ifr);