【问题标题】:how to use SIOCIFDESTROY in FreeBSD?如何在 FreeBSD 中使用 SIOCIFDESTROY?
【发布时间】:2014-09-01 07:22:03
【问题描述】:

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

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为零,但app结束时点击界面依然存在。有谁知道我可能还缺少什么?

【问题讨论】:

  • 没关系...!在我尝试过的所有事情中,我粘贴在我的问题中的确切代码是 did 工作的。由于之前创建的所有 TAP 接口,我只是没有注意到我找到了解决方案。不知道如何处理这个问题。随意关闭,或为任何希望使用 SIOCIFDESTROY 的未来开发者开放。
  • 您可能想回答这个问题 - 并重复工作代码 - 并解释发生了什么。这似乎很有价值,这样问题(可能)就不会被删除。

标签: freebsd ioctl ifconfig tun-tap


【解决方案1】:

试图找到要描述的文档的棘手部分是传递给 ioctl() 的参数。我从来没有找到合适的读物。

结果是一个完全空白的 ifreq,只需要设置 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);

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2013-12-31
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多