2014-09-01 25 views
2

我的應用程序創建一個tap界面,並且一切正常。但在FreeBSD上,當它退出時,tap界面仍然存在。要刪除它,我必須手動運行此命令:如何在FreeBSD中使用SIOCIFDESTROY?

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); 

在這一點上,犯錯是零,但是當應用程序結束TAP接口仍然存在。任何人都知道我還可能錯過什麼?

+0

沒關係......!在我嘗試的所有事情中,我在我的問題中粘貼的確切代碼是_did_的工作。我只是沒有注意到我找到了解決方案,因爲所有以前創建的TAP接口。不知道該怎麼做這個問題。隨意關閉,或留待任何未來的開發者尋求使用SIOCIFDESTROY。 – 2014-09-01 07:33:34

+0

您可能想回答這個問題 - 並重復工作代碼 - 並解釋發生了什麼。這似乎很有價值,並且這種方式(可能)的問題不會被刪除。 – cnicutar 2014-09-01 08:05:33

+0

@cnicutar完成! – 2014-09-01 08:24:10

回答

2

棘手的部分是試圖找到文檔來描述是傳遞給ioctl()的參數。我從來沒有找到任何體面的閱讀。

發現一個完全空白的ifreq只需要tap設備接口名就可以了。除了包含在問題中的原始代碼之外,還要注意,在刪除實際的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);