【问题标题】:Convert `ip tuntap add` system() call to C code将 `ip tuntap add` system() 调用转换为 C 代码
【发布时间】:2018-04-01 23:02:43
【问题描述】:

我正在尝试将我在 C 中调用 ip tuntap add ...system() 调用转换为不依赖于 system() 调用的 C 代码。

基本上,当我的应用程序被强制终止时,我使用system("ip tuntap add ...") 调用调出的隧道适配器仍然存在问题。

有人告诉我,我可以使用rtnetlink 来实现我的目标。我想将以下行转换为不依赖于 system() 调用的 C 代码。我相信如果我使用rtnetlink,当我的应用程序终止时,我启动的隧道适配器将被内核破坏,这是我想这样做的主要原因。

这是我在 C 中的当前行:

system("ip tuntap add dev tun1 mode tun");

如果rtnetlink 不是我会这样做的方式,当我的应用程序被强行终止时,是否有另一种方法会破坏隧道?

【问题讨论】:

  • 对。您正在寻找的是一个非持久性 TUN 适配器,这是您使用系统调用时的默认设置。
  • @JonathonReinhart 但是需要重新启动网络服务才能清除它,对吗?我不能这样做,因为一切都需要在 C 代码中完成.. :3
  • 不,您不必重新启动。试试这个例子:cis.syr.edu/~wedu/seed/Labs/VPN/files/simpletun.c
  • @JonathonReinhart 我没有看到system() 在那里的任何地方被调用?我看到了一个 tun_alloc 函数,但是 afaik 只获取活动隧道接口的文件描述符
  • 它可以创建一个新的tun设备。编译代码并使用它。

标签: c linux tun-tap


【解决方案1】:

@Jonathon Reinhart 在 cmets 中回答了这个问题:

您正在寻找的是非持久性 TUN 适配器。而不是使用

system("ip tuntap add dev tun1 mode tun");

查看这个文件中的tun_alloc函数:simpletun.c

你可以这样称呼它:

int tun_fd = tun_alloc("tun1", IFF_TUN | IFF_NO_PI);

当它被调用时,如果它不存在,它将创建新的隧道并返回隧道的文件描述符。如果它已经存在,它将简单地返回隧道的文件描述符。

当它创建隧道时,如果您的进程死亡,它将主动销毁隧道和任何关联的路由。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2012-07-26
    相关资源
    最近更新 更多