【问题标题】:Linux : how to set default route from C?Linux:如何从 C 设置默认路由?
【发布时间】:2014-03-29 16:56:44
【问题描述】:

如何从 C 程序设置(和替换现有的)默认网络路由?如果可能的话,我想不使用 shell 命令(这是一个低内存嵌入式系统)。您也可以在不指定网关 IP 地址的情况下设置默认路由吗?在我的应用程序中,我想让 ppp0 或 eth0 成为默认路由,具体取决于电缆是否插入 eth0。

谢谢, 弗雷德

【问题讨论】:

  • 为什么要避免使用 shell 命令?
  • 过于间接,会占用大量内存。这是在一个小型嵌入式系统上。不久前我编写了一个系统,该系统实际上会崩溃,因为它使用了太多的 ram 外壳来处理busybox命令。

标签: linux networking routing posix routes


【解决方案1】:

您可以通过 C 程序调用 IOCTL 来设置默认路由。

void main()
{
   int sockfd;
   struct rtentry rt;

   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (sockfd == -1)
   {
      perror("socket creation failed\n");
      return;
   }

   struct sockaddr_in *sockinfo = (struct sockaddr_in *)&rt.rt_gateway;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = inet_addr("Your Address");

   sockinfo = (struct sockaddr_in *)&rt.rt_dst;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = INADDR_ANY;

   sockinfo = (struct sockaddr_in *)&rt.rt_genmask;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = INADDR_ANY;

   rt.rt_flags = RTF_UP | RTF_GATEWAY;
   rt.rt_dev = "eth0";

   if(ioctl(sockfd, SIOCADDRT, &rt) < 0 )
       perror("ioctl");

   return;
}

【讨论】:

    【解决方案2】:

    你可以straceroute你想模仿的命令。这为您提供了对更改路由有用的相关系统调用。

    您可能对proc(5) 接口感兴趣,例如它的/proc/net/route 伪文件。

    另见ip(7)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2018-01-14
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多