2

私のアプリはタップ インターフェイスを作成し、すべてがうまく機能します。しかし、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 はゼロですが、アプリが終了してもタップ インターフェイスは存在します。他に何が欠けているか知っている人はいますか?

4

1 に答える 1

2

トリッキーな部分は、ioctl() に渡すパラメーターについて説明するドキュメントを見つけることでした。私はまともに読めるものを見つけたことがありません。

タップ インターフェイス名が設定された完全に空の ifreq だけが必要であることがわかります。質問に含めた元のコードに加えて、実際のタップ インターフェイスを削除する前にタップ デバイス ファイル記述子を閉じることにも注意してください。私はそれが関連しているかもしれないと想像することしかできません:

    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);
于 2014-09-01T08:23:49.033 に答える