Linux:如何设置C的默认路由?

时间:2014-03-29 16:56:45

标签: linux networking routing posix routes

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

谢谢, 佛瑞德

2 个答案:

答案 0 :(得分:7)

您可以进行IOCTL调用以设置C程序的默认路由。

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

答案 1 :(得分:2)

您可以strace您要模仿的route命令。这为您提供了有用的更改路由的系统调用。

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

另见ip(7)