我的应用创建了一个点按界面,一切正常。但是在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界面。任何人都知道我可能还缺少什么?
答案 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);